You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:13:23