面白い方へ転がっていくブログ

TouchDesignerとかUnityとか色々使って面白そうな方向へ転がっていきます。

【小ネタ】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では動かないようにしましょう。


*1:QRコードをバイナリモードにしてUTF-8なんかの文字を埋め込む事も可能なようです