金井です。
Nobuyoshi Nakada <nobu@xxxxx> wrote:
> 内部で文字コードをどのように仮定しようが、システムコードページが
> 変わるわけではなく、File.basenameはシステムコードページで処理さ
> れます。UTF-8の"デスクトップ/ABC.DEF"は 6*3 = 18バイトになるので
> Shift_JISでもちょうどよさそうに思えますが、hexでみると以下のよう
> になります。
>
> 0000000 e3 83 87 e3 82 b9 e3 82 af e3 83 88 e3 83 83 e3 >................<
> 0000020 83 97 2f 41 42 43 2e 44 45 46 >../ABC.DEF<
>
> 途中のafが半角カナ領域になるため、そこで1バイトずれてしまい、最
> 後が"97 2f"という一文字と認識されてしまいます。1バイト目だけでな
> く2バイト目までチェックすれば防げる問題だとは思いますが、ここの
> 処理はWindowsで提供されているルーチンを使っているので、そういう
> ものなんでしょう。
File.basenameなどの中身は正規表現でやっているのだと思い込んで
いました。それがそもそもの間違いだったのですね。
CGIをLinux/Windowsの両方で動かさなければならなくて困っていたの
ですが、これで解決します。
どうもありがとうございました。