Perl中用Perl6::Slurp读取UTF8文件无法替换℃字符的问题
问题原因与解决办法
问题根源
- 直接定义的字符串
$s:代码开头的use utf8;会让Perl将双引号内的字符串当作Unicode字符序列处理,所以℃被识别为单个U+2103字符,正则\x{2103}能精准匹配并替换。 - 用
Perl6::Slurp读取的$fs:该模块默认读取文件的原始字节流,不会对内容做UTF-8解码。此时文件里的℃是UTF-8编码的三个字节(0xE2 0x84 0x83),而正则里的\x{2103}匹配的是单个Unicode字符,两者类型不匹配,导致替换失败。
解决方法
以下三种方式任选其一即可:
1. 让slurp自动解码为Unicode字符串
调用slurp时传入:encoding(UTF-8)参数,直接将文件内容解码为Perl可识别的Unicode字符:
my $fs = slurp("test.md", :encoding(UTF-8));
2. 手动解码字节串
借助Encode模块,把读取到的原始字节串解码为Unicode字符序列:
use Encode; my $fs = decode('UTF-8', slurp("test.md"));
3. 改用原生文件读取(指定编码)
放弃Perl6::Slurp,直接用Perl原生文件操作,打开时指定编码:
open my $fh, '<:encoding(UTF-8)', 'test.md' or die "无法打开文件: $!"; my $fs = do { local $/; <$fh> }; close $fh;
修改后运行代码,文件内容里的℃就能被正常替换为degrees celsius了。
内容的提问来源于stack exchange,提问作者ivo Welch
相关产品推荐
相关产品推荐

