【小ネタ】HoloLensでShift-JISを扱う方法
知らなくても全然困らないけれど、知っているとどこかで役に立つかもしれないシリーズ。
今回はShift-JISをHoloLens(UWP)で扱う方法を書きたいと思います。
最近ではほとんどUnicodeでエンコーディングされているので使う機会は少ないのですが、QRコードの標準的なテキストエンコードがShift-JISなので、日本語が含まれるQRコードなんかを読み込む時に役にたつかもしれません。*1
まず初めに、通常文字エンコードの変換などを行う際に Encoding.GetEncoding()
を使うかと思うのですが、UWPの場合そのままではShift-JISは使えません。
#if UNITY_WSA && !UNITY_EDITOR Encoding Shift_JIS = Encoding.GetEncoding("shift_jis"); // ← NG #endif
という風に書いて、使用しようとすると実行時に以下のExceptionが発生します。
ArgumentException: 'shift_jis' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
というワケで、うまく動きません。
そこでおまじない的に次に示すEncoding.RegisterProvider(CodePagesEncodingProvider.Instance);
をEncoding.GetEncoding("shift_jis");
の前に呼び出してあげる必要があります。
#if UNITY_WSA && !UNITY_EDITOR Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // ←おまじない的にコレが必要 Encoding Shift_JIS = Encoding.GetEncoding("shift_jis"); // ← OK #endif
正直、何故このおまじないが必要なのかはよくわかっていないのですが、UWPでは標準で「Unicode」しか対応しておらず、このおまじないを呼び出す事でWindowsシステム内のEncoding
を取得できるようになるようです。
つまりデバイスに搭載されているWindowsがShift-JISをサポートしていなければ、この方法でもダメなようです。
幸いにもHoloLensではうまく動きます。
おまけにShift-JISで取得した文字列をUTF8へ変換するには以下のようなコードを書きます。
#if UNITY_WSA && !UNITY_EDITOR var utf8bytes = Encoding.Convert(Shift_JIS, Encoding.UTF8, Shift_JIS.GetBytes(shiftjisStr)); var utf8Str = Encoding.UTF8.GetString(utf8bytes); #endif
これで通常通りUTF-8の文字列として処理できるようになるはずです。
ちなみにこれら、例によってUWPでのみ使用可能なので、#if
ディレクティブでUnityEditorでは動かないようにしましょう。