NSStringEncodingの定義について

Smultronアップデートの度、例の文字コード変換処理のパッチを当てているんですが、最近いまひとつ変換精度が低い。あらためて調べてみるとなんとMacの日本語環境のデフォルトで作成したテキストがちゃんと変換できていないことが判明しました。

最近、会社でもマックを使うようになったのですが、どうもそのマックで作成したテキストがうまくエンコードできてません。なんで???と思って調べてみるとびっくり。

これまで、MacOSの日本語はShiftJISだとばかり思いこんでいたのですが、さにあらずShiftJISにプラスアルファの拡張が施されているみたいなんです。まあ、そのこと自体はいいとして、驚いたというのはCocoaの文字列クラスNSStringでエンコード指定する際に使用するNSStringEncodingの定数としてこの日本語(Mac OS)が定義されていないことなんです。NSStringのドキュメントには

enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   (中略)
   NSProprietaryStringEncoding = 65536
};

のように記述されているので、てっきりNSShiftJISStringEncoding=『日本語(Mac OS)』だと勘違いしていたんです。これは実際にはいわゆる『日本語(Windows DOS)』ってやつで『日本語(Mac OS)』ではないんですね。
じゃあ、『日本語(Mac OS)』にするにはどうすりゃいいんだってことで[NSString availableStringEncodings]でリストしてみたら-2147483647でした。『日本語(Mac OS)』以下、

  • 繁体字中国語(Mac OS)(-2147483646)
  • 韓国語(Mac OS)(-2147483645)
  • アラビア語(Mac OS)(-2147483644)
  • 省略

とINT_MIN+1から順に各国言語が定義されている模様。さすがにこれら全部の定数を定義するのは面倒だったのかしらん?まあ、これだけあると当面変更されることはなさそうなので、変換対象リストに-2147483647を追加してまあ解決としておきました。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/180

Comments