Mik*_*ke 1 perl filenames encoding utf-8
我不是在谈论用utf-8或非utf-8编码和东西读取文件内容.这是关于文件名.通常我将Perl脚本保存为系统默认编码,在我的情况下为"GB2312",我不会有任何文件打开问题.但是出于处理目的,我现在有一些以utf-8编码保存的Perl脚本文件.问题是:这些脚本无法打开名称由"GB2312"编码编码的字符组成的文件,我不喜欢重命名文件的想法.
有没有人碰巧有处理这种情况的经验?总是感谢任何指导.
编辑
这是用于演示我的问题的最小化代码:
# I'm running ActivePerl 5.10.1 on Windows XP (Simplified Chinese version)
# The file system is NTFS
#!perl -w
use autodie;
my $file = "./??.txt"; #the file name consists of two Chinese characters
open my $in,'<',"$file";
while (<$in>){
print;
}
Run Code Online (Sandbox Code Playgroud)
如果以"ANSI"编码保存,则此测试脚本可以运行良好(我假设ANSI编码与用于显示中文字符的GB2312相同).但如果保存为"UTF-8"则不起作用,错误信息如下:
Can't open './???.txt' for reading: 'No such file or directory'.
在此警告消息中,"娴嬭瘯"是无意义的垃圾字符.
更新
我尝试首先将文件名编码为GB2312但它似乎不起作用:(这是我尝试的:
#!perl -w
use autodie;
use Encode;
my $file = "./??.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
Run Code Online (Sandbox Code Playgroud)
我目前的想法是:我的操作系统中的文件名是测试.txt,但编码为GB2312.在Perl脚本中,文件名与人眼看起来相同,仍然是测试.txt.但对于Perl来说,它们是不同的,因为它们具有不同的内部表示.但是我不明白为什么当我已经将Perl中的文件名转换为GB2312时问题仍然存在,如上面的代码所示.
更新
我做到了,终于成功了:)
@ brian的建议是对的.我在上面的代码中犯了一个错误.我没有将编码的文件名返回给$ file.
这是解决方案:
#!perl -w
use autodie;
use Encode;
my $file = "./??.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
Run Code Online (Sandbox Code Playgroud)
如果你
use utf8;
Run Code Online (Sandbox Code Playgroud)
在你的Perl脚本中,它只告诉perl源是UTF-8.它不会影响perl如何处理外部世界.你是否打开任何其他Perl Unicode功能?
您是否遇到过每个文件名或其中一些文件的问题?你能给我们一些例子,或者一个小的演示脚本吗?我没有将名称编码为GB2312的文件系统,但您在调用open之前尝试将文件名编码为GB2312吗?
如果需要使用特定编码编码的特定字符串,可以使用" 编码"模块.尝试使用您提供的文件名open
.
归档时间: |
|
查看次数: |
3958 次 |
最近记录: |