2008年7月 1日

[ruby-list:45170] Re: Win/UTF8のFile.basename

なかだです。

At Tue, 1 Jul 2008 00:21:40 +0900,
KANAI-Takashi wrote in [ruby-list:45169]:
> UTF-8で作成したファイルを実行します。変です。
> ----------------------------------------------------------
> #!/usr/bin/ruby -Ku
> require 'nkf'

> s = "C:/Documents and Settings/kanai/デスクトップ/ABC.DEF"
> s = File.basename( s )
> puts NKF.nkf( "-s", s )
> ----------------------------------------------------------
> D:\> ruby win_utf8.rb
> デスクトップ/ABC.DEF

内部で文字コードをどのように仮定しようが、システムコードページが
変わるわけではなく、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で提供されているルーチンを使っているので、そういう
ものなんでしょう。

> 参考までに、以下の環境で同様のことをしましたが、
> 問題ありませんでした。
> Fedora8
> ruby 1.8.6 (2008-06-20 patchlevel 230) [i386-linux]

通常Unixベースのシステムでは、ファイル名のエンコーディングなどに
システムは介入しませんから、rubyでも$KCODEは影響を与えません。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦


投稿者 xml-rpc : 2008年7月 1日 01:35
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/74828
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。