macOS iconv(3) UTF-8-MAC エンコーディングの問題 - OSSTech Advent Calendar 2019 - ダメ出し Blog

2019-12-06(Fri) [unicode][utf-8-mac][iconv] [更新履歴]

Apple 社 UTF-8-MAC の呪い Advent Calendar 2019 …ではなく、 OSSTech Advent Calendar 2019 の 6 日目の記事です。

macOS iconv(3) は UTF-8-MAC という名前の特殊なエンコーディングに対応していますが、 これに問題を見つけたので紹介します。 macOS 10.14.2 (Mojave) にて確認。

その前に…

UTF-8-MAC は NFD じゃねぇえええーーーーーーーっ!!!!

NFD いうな! 福神づけ喰らわすぞ。

UTF-8 → UTF-8-MAC 変換で NFD 正規化されるのは一部の文字だけです。

例:

Original UTF-8-MAC に変換 NFD に正規化
福 (U+FA1B) ← に同じ 福 (U+798F)
神 (U+FA19) ← に同じ 神 (U+795E)
づ (U+3065) づ (U+3064 U+3099) ← に同じ
け (U+3051) ← に同じ ← に同じ

同様に UTF-8-MAC → UTF-8 変換した結果は NFC ではないぞ。 NFC いうな! NFC で正規化するな!!

UTF-8-MAC 関連の問題で NFC / NFD 正規化を使うなよ! 騙るなよ?! お兄^Hじさんとの約束だぞ!!

以下、本題。

長めの UTF-8-MAC テキストデータ → 他のエンコーディング変換が失敗する

再現例:

$ while :; do echo あああ; done |iconv -f UTF-8-MAC -t UTF-8
...
あああ
あああ
iconv: (stdin):819:6: cannot convert

絵文字などのサロゲートペアな文字の変換が失敗、あるいは壊れる

再現例:

$ echo 😀 |iconv -f UTF-8-MAC -t UTF-8
iconv: (stdin):1:0: cannot convert
$ echo 😀 |iconv -f UTF-8 -t UTF-8-MAC
$ echo 😀 |iconv -f UTF-8 -t UTF-8-MAC |od -tcx1
0000000    �  **  **  \n
           ef  bf  bd  0a
0000004

修正版

趣味でオリジナルの GNU libiconv に macOS 版 GNU libiconv の UTF-8-MAC を移植したものを作って公開しているのですが、そちらで修正してみました。

macOS でビルドできるかは試していません。駄目だったらパッチください。

自分は macOS で困ってないので Apple にバグ報告・パッチ投げする モチベーションが湧きません。 誰か困っている人、暇な人、Apple の中の人、代わりにお願いします。


ところで、12月25日はクリスマスな上に、 OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority

逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!


私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/


よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。