Windows/W32TeXで、upTeXのファイル名に関する
QA:54205,
QA:54206,
QA:54207について気になったので調べています。
Unicodeがらみの話題になりそうなので、TeX Q & AのBBSではなく、こちらのフォーラムに来ました。詳しい方、お付き合いをお願いします。
問題の "欲.tex" は、Shift_JIS(CP932)で2バイト目が7Eになっているのが
引っかかっている原因のようです。
この問題は、upTeXだけでなくluatexでも同様のようです。
「ファイル名はASCIIの範囲にするのが推奨」という現状も分かりますが、いつまで経っても解決しないのももどかしいので何とかしたい、という思いはあります。さらに、どうせならCP932の範囲ではなくて、Unicodeの範囲で扱えるようにしておきたいです。"♥.tex" とか。
Shift_JISの"欲"のように、従来のマルチバイトで2バイト目が7E(ASCIIの"~")になり得るような文字コードは、日本のShift_JISを含めて
↓のものがあるようです。
日本語 CodePage 932 Shift_JISのMS版
簡体中国語 CodePage 936 GBKのMS版
繁体中国語 CodePage 950 Big5のMS版
(韓国の CodePage 949 はマルチバイト文字に7Eを使用していない)
これらの言語版の Windows + W32TeX の luatex でも問題発生すると予測できます。日本ローカルの話でもないしupTeX限定の話でもなさそうなので、きちんと対処できれば国際的な開発の場でも取り入れてもらえるんじゃないか、という期待が持てます。
Windowsでは、C標準のfopenはANSI版(従来のマルチバイト)なのでUnicode文字列を扱えませんが、NT系列でファイル名はUTF-16LEで管理されていて適切にコーディングすれば、Unicodeのファイル名を扱えるようになるはずです。
コーディングのポイントはANSI版でなくてUnicode版でよければ、
(1) コマンドラインの読み込みに GetCommandLineW() を使う
(2) ファイルのopenに wfopen() を使う
でよいみたいです。
ANSIのfopenのwchar_t版でも _wfopen() でUnicodeのファイル名を扱えるそうです。参考: 奥村先生のblogの↓。
http://oku.edu.mie-u.ac.jp/~okumura/blog/node/2236コマンドラインの文字コードをいろいろ想定するならかなり手の込んだことをやらないといけないようです。↓
ruby_dev Mailing list の 35339, 35343, 35345, 35347, 35348あたり
http://blade.nagaokaut.ac.jp/ruby/ruby-dev/35201-35400.shtml要改造箇所は、
[1] コマンドラインでのUnicode文字列の読み込み
[2] ファイルのopen
[3] kpathsearchのUnicode対応
あたりでしょうか? 他に注意すべき点はありますか?
[1][2]は、Windows NT系列限定なら GetCommandLineW(), wopen() の使用で悩みませんが、「Windows 95/98/Me系列ならば従来のマルチバイトで動作する」のような両立を一つのバイナリーで実現することは可能なのでしょうか? あるいはもう95/98/Meを見捨てる選択もありかと思いますがどうなのでしょうか?
[3]は、kpathsearchの設定ファイルや文字コードなどの想定をUTF-8限定にしてしまえば、すぐに動きそうな気がしますが、そういう想定をしてしまうことに問題はありますか? Windows以外のプラットフォームでも、UTF-8決め打ちにしたら迷惑な環境はあるのでしょうか? 「pTeXでkpathsearchを使うときにShift_JIS/EUCで動いていたのに…」みたいな副作用があるのでしょうか?
漠然とした質問ですが、議論にお付き合いの程、よろしくお願いします。