kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

WindowsのUnicodeとShift-JISのラウンドトリップしない文字

I18N : WindowsとLinuxでの文字処理の違い | OPC Diary
石坂さんのところでもちょこっと書かれていますが、MS独自拡張(正確には日本のメーカーが独自にあいている領域に追加した文字)と言っているあたりはほんとに悩まされます。Shift-JISの範囲ではNEC選定IBM互換文字とIBM互換文字と言われている同じ文字が複数の位置に割り振られています。
[PRB] SHIFT - JIS と Unicode 間の変換問題
Unicode対応していないWindows 3.1/95の時代はそれで(まだ)よかったんですが、内部がUnicodeで処理されているWindows NT系では内部で一度Unicodeへ変換されることになっています。
たとえばU+9ed1(鄢)はShift-JISでは0xfc4bと0xeeec二つにあります。0xeeecがくるとWindowsはU+9ed1に変換します。U+9ed1と同じShift-JISのコードは二つあるので、どちらか選ばないといけません。こういうとき、Windowsの仕様でIBM互換文字のほうにすることが決まっています。よって、Shift-JISで出力するタイミングでルールに従って、0xfc4bになります。Samba 2.xでも結構この辺苦労されていたようですね。この辺のコードで検索すると結構SambaのMLが引っかかります。
普通はまぁこんな0xeeecが来ることなんてないと思うんですが、ホストとかと連携してデータ受渡しするときは、ホスト側がNEC選定IBM互換文字だったとかになりがちなので気を付けてください。
今はというか、Vista以降Unicodeというかg18n/i18nAPI増えているんですよねぇ。
Internationalization for Windows Applications (Windows)
この辺から下のとくにUniscribeとか使える気がしません。一度ほかのブラウザどうしているんだろうと見たことがあったんですが、当時は実装されているものを見かけなかったと記憶しているけど、今は違うのかな。