--.--.--(--)
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に格納する場合はこんな感じ。
実際には、文字列はNSStringで格納しているので、NSMutableStringのstringWithStringメソッドを使ってNSMutableStringのオブジェクトを作成しています。
最初、”Mac UTF-8 NFC”とかのキーワードで探していたのですが、なかなか見つかりませんでした。
英語のサイトもいろいろ見て回りました。
このキーワードだと、Appleの情報や他の情報からも、丁度、すり抜けてるようでした。
Appleの情報はこれ。
http://developer.apple.com/jp/qa/qa2001/qa1235.html
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
TrackBackURL → http://memo358.blog18.fc2.com/tb.php/47-c28035fc
| Home |


最新記事のRSS
最新コメントのRSS

