--.--.--(--)
上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。
2008.07.11(Fri)
マルチプラットフォーム&多言語対応したアプリケーションを作る場合に考えないと行けないのが、文字コードです。
で、UTF-8でやろうということになったのですが・・・。

一通り、プロトタイプを作って、いざ、WindowsとMacで動作確認してみると、Macで作った日本語を含むUTF-8をWindowsで使おうとすると・・・。
なんか変。
文字化けしてます。

で、検索してみると、割と有名な話みたいでした。
UTF-8には何種類か符号化の方法があって、一般的にはNormalization Form C(NFC)というものが使われていますが、Mac OSXではNormalization Form D(NFD) が使われています。
ということで、MacのUTF-8な文字データをそのままWindowsへ渡すと、うまく扱う事ができません。

普段は、そもそもWindowsとMacでファイルのやり取りする時は、ほとんど日本語を使う事はなかったので、気づいてませんでした。
なんとなく、OS9やOSXでも10.2のころから使っていたので、Samabaの2系じゃもともとダメだったりと、日本語を使わない癖がついてしまっていました。
で、本題の変換方法です。

CFStringNormalizeというのを使うとできます。

NSMutableStringに設定されている通常のUTF-8(NFD)をUTF-8(NFC)に変換し、NSDataに格納する場合はこんな感じ。
NSMutableString *message=@"日本語だよ"//この場合”だ”がおかしくなる
CFStringNormalize((CFMutableStringRef)message, kCFStringNormalizationFormC);
NSData *messageData = [message dataUsingEncoding:NSUTF8StringEncoding];

実際には、文字列はNSStringで格納しているので、NSMutableStringのstringWithStringメソッドを使ってNSMutableStringのオブジェクトを作成しています。

最初、”Mac UTF-8 NFC”とかのキーワードで探していたのですが、なかなか見つかりませんでした。
英語のサイトもいろいろ見て回りました。
このキーワードだと、Appleの情報や他の情報からも、丁度、すり抜けてるようでした。
Appleの情報はこれ。

http://developer.apple.com/jp/qa/qa2001/qa1235.html
Comment












管理者にだけ表示を許可する

TrackBack