MS-WIndows 環境での Haskell の文字コード

  • 日本語を含んだHaskellソースコードは UTF8 で記述しますがコンパイルされた文字列はHaskellの内部コード UCS4 に変換されます。
  • Windows システムとの文字列のやり取りは UCS4 から SJIS に変換して書き込み、受信した文字列はSJISからUCS4に変換します。
  • BSTR文字コードはUTF16です。日本語を使う分にはUCS4と同じですがフォーマットを変換する必要があるのでAPIを呼んでBSTRに変換します。
import System.Time  (getClockTime)
import Cinnamon.Ucs (ucs4ToSjis, sjisToUcs4, ucs4ToUtf8, utf8ToUcs4)

doCommand :: (Selection y, Selection m, Textual l, Paint l) => y -> m -> l -> IO ()
doCommand yearInObj monthInObj log = do
    cOleInitialize 0
    -- ソースコードは UTF8 ですがコンパイルするとUCS4なので、
    -- UCS4からSjisに変換して Excel ファイルを開きます。
    cFullName  <- getFullPathName  (ucs4ToSjis "日本語ファイル名.xls")
    exl        <- excelOpen cFullName

    -- Windows から取得した文字列は SjisなのでUcs4に変換して wxHakell で表示。
    ctime      <- getClockTime
    writeText log $ sjisToUcs4 (show ctime ++ "\n")

    -- UTF8 で記述された日本語はコンパイルすると UCS4なのでそのまま wxHakell に表示。
    writeText log "【シートタイトル】\n"

    ctime <- getClockTime
    writeText log ((sjisToUcs4 (show ctime)) ++ "\n●終了しました\n")
    cOleUninitialize

GHC 6.12.1で改善されたようなのでもっと使いやすくなっていると思います・・・調べてみます。