今回はShift JISとUnicodeの変換を行った。
static UInt16 ShiftJis2Unicode(UInt16 ShiftJisChar) { byte[] buff2 = Encoding.Unicode.GetBytes( new[] { Encoding.GetEncoding("Shift_JIS").GetChars( new [] { (byte)(ShiftJisChar / 256), (byte)(ShiftJisChar % 256), } )[0] }); return ((UInt16)(buff2[0] | buff2[1] << 8)); } static UInt16 Unicode2ShiftJis(UInt16 UnicodeChar) { byte[] buff2 = Encoding.GetEncoding("Shift_JIS").GetBytes( new[] { Encoding.Unicode.GetChars( new[] { (byte)(UnicodeChar % 256), (byte)(UnicodeChar / 256), } )[0] }); return ((UInt16)(buff2[0] << 8 | buff2[1])); }
Shift JISはASCIIと互換性があり、また半角カナも1バイトで表現できる。が、今回はマルチバイト文字しか考えていないので、シングルバイト文字を入れると問題が起きるはず。
Unicodeは文字にかかわらず2バイトで表現するので、たぶん動くはず。
UnicodeとUTF-8とかの変換は、また別の問題なので今回は扱わない。
ちなみにC#のcharはUnicodeらしく、intに入れるとUnicodeのインデックスになる。intをcharにキャストするとUnicodeで文字化される。今回はEncoding.Unicode.GetCharsとか使ったけど、Unicode対ならcharのキャストでも良いかも。
他のエンコーディングとの変換も同じようにすれば動くはずだけど、それぞれバイトオーダーや固定長・可変長みたいなバリエーションがあるので、ちょっと面倒。
今回は文字単位での変換だったけど、文字列の変換だともっと簡単にできるみたいね(未確認)。
0 件のコメント:
コメントを投稿