MacOS X ファイル名と convmv
こんにちは moriyama です。
convmv というファイル名文字コード変換ツールがあります。
この convmv は、Perl で記述されていて MacOS X の Decomposed UTF-8 (Modified NFD) を変換できるように、--nfc と --nfd オプションが指定できるようになっています。それぞれ、Perl の Unicode::Normalize モジュールの NFC および NFD の正規化処理を呼び出しています。
Unicode::Normalize モジュールは、Unicode 規格の正規化処理をそのまま実装したものですのですので、前回の記事 MacOS X とのファイル共有 で書いたように、U+2000~U+2FFF、U+F900~U+FAFF、U+2F800~U+2FAFF の扱いが MacOS X のファイル名と正規化の方法が異なり注意する必要があります。
具体的にどのような所に注意する必要があるのか調べてみました。
調査対象とした文字集合
- JIS X 0213:2004
- JIS X 0212-1990
- マイクロソフト標準キャラクタセット
調査結果
表1 に示す文字が正規合成 (NFC) による正規化処理で別のコードポイントに置換されてしまう事が確認されました。
この事からMacOS X のファイル名を convmv の --nfc オプションで変換する際には、このような置換が行われる事を認識して使用すべきという事になります。
ちなにみ JIS X 0212-1990 は Unicode の正規化処理の影響を受けないことが確認されました。
| 文字 | JIS X 0213:2004 面-区-点 | CP932 コード値 | Unicode コード値 | NFC | NFD | MacOS X の ファイル名 | |||
|---|---|---|---|---|---|---|---|---|---|
| ά | 1-11-39 | U+1F71 | ά | U+03AC | ά | U+03B1 U+0301 | ά | U+03B1 U+0301 | |
| έ | 1-11-49 | U+1F73 | έ | U+03AD | έ | U+03B5 U+0301 | έ | U+03B5 U+0301 | |
| Å | 1-02-82 | 0x81F0 | U+212B | Å | U+00C5 | Å | U+0041 U+030A | Å | U+212B |
| 欄 | 1-86-27 | U+F91D | 欄 | U+6B04 | 欄 | U+6B04 | 欄 | U+F91D | |
| 廊 | 1-84-14 | U+F928 | 廊 | U+5ECA | 廊 | U+5ECA | 廊 | U+F928 | |
| 朗 | 1-85-46 | 0xFAE0 | U+F929 | 朗 | U+6717 | 朗 | U+6717 | 朗 | U+F929 |
| 虜 | 1-91-47 | U+F936 | 虜 | U+865C | 虜 | U+865C | 虜 | U+F936 | |
| 殺 | 1-86-41 | U+F970 | 殺 | U+6BBA | 殺 | U+6BBA | 殺 | U+F970 | |
| 類 | 1-94-04 | U+F9D0 | 類 | U+985E | 類 | U+985E | 類 | U+F9D0 | |
| 隆 | 1-93-61 | 0xFBE9 | U+F9DC | 隆 | U+9686 | 隆 | U+9686 | 隆 | U+F9DC |
| 塚 | 1-15-55 | 0xFA9C | U+FA10 | 塚 | U+585A | 塚 | U+585A | 塚 | U+FA10 |
| 晴 | 0xFAD8 | U+FA12 | 晴 | U+6674 | 晴 | U+6674 | 晴 | U+FA12 | |
| 凞 | 1-87-58 | 0xFB58 | U+FA15 | 凞 | U+51DE | 凞 | U+51DE | 凞 | U+FA15 |
| 猪 | 1-87-79 | 0xFB5E | U+FA16 | 猪 | U+732A | 猪 | U+732A | 猪 | U+FA16 |
| 益 | 0xFB75 | U+FA17 | 益 | U+76CA | 益 | U+76CA | 益 | U+FA17 | |
| 礼 | 0xFB7D | U+FA18 | 礼 | U+793C | 礼 | U+793C | 礼 | U+FA18 | |
| 神 | 1-89-28 | 0xFB7E | U+FA19 | 神 | U+795E | 神 | U+795E | 神 | U+FA19 |
| 祥 | 1-89-29 | 0xFB80 | U+FA1A | 祥 | U+7965 | 祥 | U+7965 | 祥 | U+FA1A |
| 福 | 1-89-33 | 0xFB82 | U+FA1B | 福 | U+798F | 福 | U+798F | 福 | U+FA1B |
| 靖 | 0xFB86 | U+FA1C | 靖 | U+9756 | 靖 | U+9756 | 靖 | U+FA1C | |
| 精 | 0xFB89 | U+FA1D | 精 | U+7CBE | 精 | U+7CBE | 精 | U+FA1D | |
| 羽 | 0xFB92 | U+FA1E | 羽 | U+7FBD | 羽 | U+7FBD | 羽 | U+FA1E | |
| 蘒 | 2-87-24 | 0xFB9F | U+FA20 | 蘒 | U+8612 | 蘒 | U+8612 | 蘒 | U+FA20 |
| 諸 | 1-92-14 | 0xFBA9 | U+FA22 | 諸 | U+8AF8 | 諸 | U+8AF8 | 諸 | U+FA22 |
| 逸 | 0xFBB4 | U+FA25 | 逸 | U+9038 | 逸 | U+9038 | 逸 | U+FA25 | |
| 都 | 1-92-74 | 0xFBB7 | U+FA26 | 都 | U+90FD | 都 | U+90FD | 都 | U+FA26 |
| 飯 | 0xFBF6 | U+FA2A | 飯 | U+98EF | 飯 | U+98EF | 飯 | U+FA2A | |
| 飼 | 0xFBF7 | U+FA2B | 飼 | U+98FC | 飼 | U+98FC | 飼 | U+FA2B | |
| 館 | 0xFBF9 | U+FA2C | 館 | U+9928 | 館 | U+9928 | 館 | U+FA2C | |
| 鶴 | 0xFC49 | U+FA2D | 鶴 | U+9DB4 | 鶴 | U+9DB4 | 鶴 | U+FA2D | |
| 侮 | 1-14-24 | U+FA30 | 侮 | U+4FAE | 侮 | U+4FAE | 侮 | U+FA30 | |
| 僧 | 1-14-41 | U+FA31 | 僧 | U+50E7 | 僧 | U+50E7 | 僧 | U+FA31 | |
| 免 | 1-14-48 | U+FA32 | 免 | U+514D | 免 | U+514D | 免 | U+FA32 | |
| 勉 | 1-14-67 | U+FA33 | 勉 | U+52C9 | 勉 | U+52C9 | 勉 | U+FA33 | |
| 勤 | 1-14-72 | U+FA34 | 勤 | U+52E4 | 勤 | U+52E4 | 勤 | U+FA34 | |
| 卑 | 1-14-78 | U+FA35 | 卑 | U+5351 | 卑 | U+5351 | 卑 | U+FA35 | |
| 喝 | 1-15-12 | U+FA36 | 喝 | U+559D | 喝 | U+559D | 喝 | U+FA36 | |
| 嘆 | 1-15-15 | U+FA37 | 嘆 | U+5606 | 嘆 | U+5606 | 嘆 | U+FA37 | |
| 器 | 1-15-22 | U+FA38 | 器 | U+5668 | 器 | U+5668 | 器 | U+FA38 | |
| 塀 | 1-15-58 | U+FA39 | 塀 | U+5840 | 塀 | U+5840 | 塀 | U+FA39 | |
| 墨 | 1-15-62 | U+FA3A | 墨 | U+58A8 | 墨 | U+58A8 | 墨 | U+FA3A | |
| 層 | 1-47-65 | U+FA3B | 層 | U+5C64 | 層 | U+5C64 | 層 | U+FA3B | |
| 屮 | 1-47-66 | U+FA3C | 屮 | U+5C6E | 屮 | U+5C6E | 屮 | U+FA3C | |
| 悔 | 1-84-48 | U+FA3D | 悔 | U+6094 | 悔 | U+6094 | 悔 | U+FA3D | |
| 慨 | 1-84-60 | U+FA3E | 慨 | U+6168 | 慨 | U+6168 | 慨 | U+FA3E | |
| 憎 | 1-84-62 | U+FA3F | 憎 | U+618E | 憎 | U+618E | 憎 | U+FA3F | |
| 懲 | 1-84-65 | U+FA40 | 懲 | U+61F2 | 懲 | U+61F2 | 懲 | U+FA40 | |
| 敏 | 1-85-08 | U+FA41 | 敏 | U+654F | 敏 | U+654F | 敏 | U+FA41 | |
| 既 | 1-85-11 | U+FA42 | 既 | U+65E2 | 既 | U+65E2 | 既 | U+FA42 | |
| 暑 | 1-85-35 | U+FA43 | 暑 | U+6691 | 暑 | U+6691 | 暑 | U+FA43 | |
| 梅 | 1-85-69 | U+FA44 | 梅 | U+6885 | 梅 | U+6885 | 梅 | U+FA44 | |
| 海 | 1-86-73 | U+FA45 | 海 | U+6D77 | 海 | U+6D77 | 海 | U+FA45 | |
| 渚 | 1-86-87 | U+FA46 | 渚 | U+6E1A | 渚 | U+6E1A | 渚 | U+FA46 | |
| 漢 | 1-87-05 | U+FA47 | 漢 | U+6F22 | 漢 | U+6F22 | 漢 | U+FA47 | |
| 煮 | 1-87-53 | U+FA48 | 煮 | U+716E | 煮 | U+716E | 煮 | U+FA48 | |
| 爫 | 2-80-09 | U+FA49 | 爫 | U+722B | 爫 | U+722B | 爫 | U+FA49 | |
| 琢 | 1-88-05 | U+FA4A | 琢 | U+7422 | 琢 | U+7422 | 琢 | U+FA4A | |
| 碑 | 1-89-07 | U+FA4B | 碑 | U+7891 | 碑 | U+7891 | 碑 | U+FA4B | |
| 社 | 1-89-19 | U+FA4C | 社 | U+793E | 社 | U+793E | 社 | U+FA4C | |
| 祉 | 1-89-20 | U+FA4D | 祉 | U+7949 | 祉 | U+7949 | 祉 | U+FA4D | |
| 祈 | 1-89-23 | U+FA4E | 祈 | U+7948 | 祈 | U+7948 | 祈 | U+FA4E | |
| 祐 | 1-89-24 | U+FA4F | 祐 | U+7950 | 祐 | U+7950 | 祐 | U+FA4F | |
| 祖 | 1-89-25 | U+FA50 | 祖 | U+7956 | 祖 | U+7956 | 祖 | U+FA50 | |
| 祝 | 1-89-27 | U+FA51 | 祝 | U+795D | 祝 | U+795D | 祝 | U+FA51 | |
| 禍 | 1-89-31 | U+FA52 | 禍 | U+798D | 禍 | U+798D | 禍 | U+FA52 | |
| 禎 | 1-89-32 | U+FA53 | 禎 | U+798E | 禎 | U+798E | 禎 | U+FA53 | |
| 穀 | 1-89-45 | U+FA54 | 穀 | U+7A40 | 穀 | U+7A40 | 穀 | U+FA54 | |
| 突 | 1-89-49 | U+FA55 | 突 | U+7A81 | 突 | U+7A81 | 突 | U+FA55 | |
| 節 | 1-89-68 | U+FA56 | 節 | U+7BC0 | 節 | U+7BC0 | 節 | U+FA56 | |
| 練 | 1-90-14 | U+FA57 | 練 | U+7DF4 | 練 | U+7DF4 | 練 | U+FA57 | |
| 縉 | 2-84-48 | U+FA58 | 縉 | U+7E09 | 縉 | U+7E09 | 縉 | U+FA58 | |
| 繁 | 1-90-19 | U+FA59 | 繁 | U+7E41 | 繁 | U+7E41 | 繁 | U+FA59 | |
| 署 | 1-90-26 | U+FA5A | 署 | U+7F72 | 署 | U+7F72 | 署 | U+FA5A | |
| 者 | 1-90-36 | U+FA5B | 者 | U+8005 | 者 | U+8005 | 者 | U+FA5B | |
| 臭 | 1-90-56 | U+FA5C | 臭 | U+81ED | 臭 | U+81ED | 臭 | U+FA5C | |
| 艹 | 2-85-84 | U+FA5D | 艹 | U+8279 | 艹 | U+8279 | 艹 | U+FA5D | |
| 艹 | 2-85-85 | U+FA5E | 艹 | U+8279 | 艹 | U+8279 | 艹 | U+FA5E | |
| 著 | 1-91-07 | U+FA5F | 著 | U+8457 | 著 | U+8457 | 著 | U+FA5F | |
| 褐 | 1-91-79 | U+FA60 | 褐 | U+8910 | 褐 | U+8910 | 褐 | U+FA60 | |
| 視 | 1-91-89 | U+FA61 | 視 | U+8996 | 視 | U+8996 | 視 | U+FA61 | |
| 謁 | 1-92-15 | U+FA62 | 謁 | U+8B01 | 謁 | U+8B01 | 謁 | U+FA62 | |
| 謹 | 1-92-16 | U+FA63 | 謹 | U+8B39 | 謹 | U+8B39 | 謹 | U+FA63 | |
| 賓 | 1-92-24 | U+FA64 | 賓 | U+8CD3 | 賓 | U+8CD3 | 賓 | U+FA64 | |
| 贈 | 1-92-29 | U+FA65 | 贈 | U+8D08 | 贈 | U+8D08 | 贈 | U+FA65 | |
| 辶 | 2-89-73 | U+FA66 | 辶 | U+8FB6 | 辶 | U+8FB6 | 辶 | U+FA66 | |
| 逸 | 1-92-57 | U+FA67 | 逸 | U+9038 | 逸 | U+9038 | 逸 | U+FA67 | |
| 難 | 1-93-67 | U+FA68 | 難 | U+96E3 | 難 | U+96E3 | 難 | U+FA68 | |
| 響 | 1-93-86 | U+FA69 | 響 | U+97FF | 響 | U+97FF | 響 | U+FA69 | |
| 頻 | 1-93-91 | U+FA6A | 頻 | U+983B | 頻 | U+983B | 頻 | U+FA6A | |
convmv の MacOS X 対応実験パッチ
convmv の --nfd と --nfc オプションで MacOS X ファイル名互換の正規化処理を行うようにする修正パッチを実験的に作ってみました。
※あくまで動作確認のため実験的に作成したパッチですので無保証です。実際に使う場合は自己責任でお願いいたします。
convmv-1.10-macosx.patchをダウンロード
ごく簡単なテストですが、UTF-8 に変換した CP932 の全文字を --nfc オプションで変換しても CJK互換漢字 (U+F900〜U+FAFF) が保存される事を確認できました。また、JIS X 0213:2004 に関しては、表2 の 2文字以外は保存される事が確認できました。
| 文字 | JIS X 0213:2004 面-区-点 | CP932 コード値 | Unicode コード値 | NFC | NFD | MacOS X の ファイル名 | |||
|---|---|---|---|---|---|---|---|---|---|
| ά | 1-11-39 | U+1F71 | ά | U+03AC | ά | U+03B1 U+0301 | ά | U+03B1 U+0301 | |
| έ | 1-11-49 | U+1F73 | έ | U+03AD | έ | U+03B5 U+0301 | έ | U+03B5 U+0301 | |
MacOS X ファイル名に関する情報は少ないため苦労している方も多いかと思いますが、基本的には MacOS X 固有の処理は MacOS X 自身で処理できないか? という事を考えて、それが出来ない場合の次善の策としてどのような対応が良いのかという事を考えるようにし必要以上に問題が拡散しないようにすると良いでしょう。




コメント