Jump to navigation
2006-09-06
UnicodeからShift-JISへの変換 [by miyachi]
日本語コードは最近のプラットホームではUnicodeに統一されつつあります。Java/MacOS-X/.NET等の環境では内部コードはUnicodeです。とは言えお仕事をしていたり古いコードが捨てられない場合にはどうしても旧来のShift-JISで文字列を取得する必要がある場合がまだまだ多いのも事実でしょう。メモ代わりに簡単に各種言語や環境でもUnicodeからShift-JISへの変換例をまとめます。
まずはJavaです。私も最初にUnicodeとShift-JISの変換が必要になったのはJava環境でした。またShift-JISと言っても細かく分けると色々ありJava環境でも混乱しています。ここではWindows環境で一般的な"MS932"をShift-JISとして扱った例を示します。JavaではShift-JISは文字列として扱えないのでbyte列として取得する事になります。
// ----- Java -----------------------------------------------
// Unicode文字列をShift-JISに変換してbyte[]に格納
String str = "日本語";
byte[] sjisData = str.getBytes("MS932");
// "MS932"はWindows用で"SJIS"が本来のShift-JIS
// ----------------------------------------------------------
次に最近やったばかりのCocoa/Objective-Cの環境での変換。Objective-CでもShift-JISは文字列として扱えないのでNSDataとして取得します。しかしObjective-Cって何でこんなに1行が長くなるかな(笑) ちなみに [str cString]; でも const char * のポインタ取得できますがこれは使わない方が良いそうです。
// ------ Objective-C ---------------------------------------
// Unicode文字列をShift-JISに変換してNSDataに格納
NSString* str = @"日本語";
NSData* sjisData = [ str
dataUsingEncoding:NSShiftJISStringEncoding // SJIS変換指定
allowLossyConversion:YES // 変換不能でもとにかく変換
];
// ----------------------------------------------------------
最後はWindowsの.NET環境と言う事でC++/CLIでの例をおまけとして。幾つか試してみましたが結局はMFC/ATLのCStringを使って変換するのが一番簡単で間違いが無いようです。
// ------ C++/CLI (おまけ) ----------------------------------
// マネージコードUnicode文字列を変換してMFCのCStringに格納
String^ str = L"日本語";
CStringA sjisStr = str; // 手抜きだけど一番楽かと…
// ----------------------------------------------------------
あと最近はXMLだとUTF-8形式が一般的ですね。内部コードはUnicodeでXMLはUTF-8がこれからの標準でしょうか。本来は上記のようなコード変換は不要になるが一番なので、ぼちぼちと移行して行きたいですね。