Perl分割Unicode章节符号后出现替换字符,需添加何种编解码处理?
解决Perl处理Unicode分隔符§时的乱码问题
问题核心是编码不匹配:bash中$'\u0A7'生成的是UTF-8编码的§(字节序列为C2 A7),但Perl默认以字节流方式处理输入,未将其解码为Unicode字符。当你用\N{SECTION SIGN}(Unicode字符)执行分割时,Perl无法匹配对应的字节序列,导致分割失败,残留的部分字节被显示为替换字符�。
两种可行的解决方式:
1. 使用Perl的-C参数启用UTF-8处理
通过-C命令行参数让Perl对标准输入、输出和命令行参数启用UTF-8编码支持,直接匹配Unicode分隔符:
perl -C -n -e 'chomp; @sx = split(/\N{SECTION SIGN}/, $_); print "$sx[0] :: $sx[1]\n";' <<< 12345$'\u0A7'abcdef
执行后输出正确结果:
12345 :: abcdef
2. 在Perl代码中显式设置输入输出编码
通过use open编译指令指定标准输入、输出、错误流均使用UTF-8编码:
perl -n -e 'use open qw(:std :utf8); chomp; @sx = split(/\N{SECTION SIGN}/, $_); print "$sx[0] :: $sx[1]\n";' <<< 12345$'\u0A7'abcdef
额外说明
bash的$'\uXXXX'语法需要bash 4.2及以上版本支持,生成的是UTF-8编码字符。确保脚本运行环境中bash和Perl的编码环境一致(均采用UTF-8),即可避免此类乱码问题。
内容的提问来源于stack exchange,提问作者JohnT
相关产品推荐
相关产品推荐

