多言語対応 ini ファイル on C# .NET

ini ファイルも多言語対応したいらしい、やっぱり。今のプロジェクト。

で、中国語を放り込んでみたけど文字化けしてうまく動かない、という攻撃を食らってしまった。 UTF-8 で書いてみた場合、最悪 Exception を投げて終了してしまう、と。

フォーマットは難しくないけど車輪の再発明はいや、ということで GetPrivateProfileString を使用していた今のコード。エンコードを指定するような引数も見当たらないのでいろいろ調べてみる。いっぱい検索する。

どうも GetPrivateProfileStringA だと ANSI モード、 GetPrivateProfileStringW だと Unicode モードという記述は出てくるもののそれ以上がない。実際に ini ファイルのエンコーディングを変更しながらデバッグしてみるも UTF-8 をどうにも扱えないもよう。読み込んだ byte 配列を UTF-8 として文字列へデコードしてみるも null 文字がいっぱい入る。

ところで、 Windows におけるいわゆる Unicode というヤツは UTF-16 (Little Endian) を指すという話がある。 System.Text.UnicodeEncoding の説明にはちゃんとUnicode 文字の UTF-16 エンコーディングを表しますと書かれているくらいだ。

……ということで、 ini ファイルを UTF-16 (Little Endian) にしてやると問題なく動いた。少なくとも日本語では。

.NET になってまで ini ファイルを使用している理由は指定されたからであって、わたしが好んで選んだわけではない。断じてない。正直めんどっちい。