2012-03-02 10 views
1

ユニコードに関するCWDモジュールは最新ではないか、またはOSに書き込むときにのみabs_pathが使用されると思われますか?CWDユニコードサポート

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use utf8; 
binmode STDOUT, ':encoding(utf-8)'; 
use Cwd qw(abs_path); 
use File::Spec::Functions qw(rel2abs); 

chdir '/tmp'; 

my $file = "Hello \x{263a}"; 

open my $fh, '>', $file or die $!; 
say $fh 'test'; 
close $fh; 

say abs_path $file; 
say rel2abs $file; 

出力:

# /tmp/Hello ⺠
# /tmp/Hello ☺ 

答えて

3

Cwdモジュールは内部でchar *タイプを使用しているため、エンコードはまったく処理されません。一般的に、ファイルシステムは、特殊文字(例えば '/')をエスケープしている限り、ファイル名に使用する文字やエンコードを気にしません。

ファイルパスがUTF-8であることを伝えたい場合、それをエンコードすることができます:

use Encode qw(decode_utf8); 

... 
say decode_utf8(abs_path $file); 
+1

@sid_comエンコードエラーを検出できるように、エンコード/デコード関数には常に1の余分な引数を渡したいと思います。ここでは 'decode_utf8(abs_path($ file) 1) '。あなたが' Encode'モジュールからインポートしてそこに渡すことができる他の魅力的な値があります.1は 'FB_CROAK'に相当し、あなたにそれを隠す代わりにエラーで例外を発生させます。 – tchrist

+1

'decode_utf8(abs_path encode_utf8($ file));'であり、ファイル名がUTF-8を使用していると仮定しています。 – ikegami

1

Perlはあなたが提供する、それが返すパスとエンコードパスを復号化するためにあなたにそれを残します。 (YUCK!)

+0

私はこれが次善の問題ではないことに同意しますが、より良いアイデアはありますか?どのようにこれは自動的に、正しく、そして移植可能なのでしょうか? – tchrist

+0

@tchrist、私はそのファイル名を読むことはできませんまたは表示されません購入しません。したがって、それを行うことができます。 *ハードにすることができます。これは、各プログラマーに必然的に壊れた解決策が出てくるのではなく、言葉で一度作業を行う理由です。 – ikegami

+0

オペレーティングシステムだけでなく、マウントされた各ファイルシステムにも依存しませんか?それが8ビットエンコーディングであれば、誰がどのように扱わなければならないのでしょうか?ユーザーのロケール設定でもそれを変更できます。私は本当にそれがどのようにできるか分からない。 UTF-8を自動的にエンコード/デコードするのは安全ではないようです。なぜなら、それは必ずしもそうではないからです。 – tchrist

関連する問題