Windows下Perl替换UTF-8字符串出现乱码问题求助
解决Windows 10下Perl命令行替换文本的乱码问题
问题根源
- 命令行字符传递编码不匹配:Windows控制台默认用本地编码(如CP936)传递非ASCII字符(如替换文本中的越南语),添加
use utf8;后Perl会将脚本代码当作UTF-8解析,导致编码冲突报错。 - 编码设置重复冲突:原始命令同时使用
-CSD参数、binmode和use open,多重编码规则叠加引发输出乱码;另外type命令在UTF-8代码页下处理文件可能存在兼容性问题。
可行解决方案
方案1:简化Perl参数,直接读取文件(推荐)
使用-CSDA参数统一编码规则,避免管道和重复设置:
chcp 65001 >nul && c:\Strawberry\perl\bin\perl -CSDA -pe "s/__compare_loan__/So sánh sản phẩm cho vay/g" test.txt
chcp 65001 >nul:设置控制台为UTF-8编码,屏蔽冗余提示-CSDA:Perl参数,C指定标准输入/输出/错误用UTF-8;S覆盖stdio层编码;D让默认打开的文件用UTF-8;A确保命令行参数(替换文本)以UTF-8解析
方案2:调整管道命令的编码设置
如果必须使用管道,移除重复的binmode设置:
chcp 65001 >nul && type test.txt | c:\Strawberry\perl\bin\perl -CSD -pe "use open ':std', ':encoding(UTF-8)'; s/__compare_loan__/So sánh sản phẩm cho vay/g"
- 依赖
-CSD参数处理标准流编码,避免手动binmode的重复配置
方案3:使用独立Perl脚本文件(最稳定)
创建replace.pl脚本(保存为UTF-8编码):
use utf8; use open ':std', ':encoding(UTF-8)'; s/__compare_loan__/So sánh sản phẩm cho vay/g;
执行命令:
chcp 65001 >nul && c:\Strawberry\perl\bin\perl replace.pl test.txt
- 脚本文件的UTF-8编码配合
use utf8;,彻底避免命令行字符传递的编码问题
内容的提问来源于stack exchange,提问作者Vojta Havránek
相关产品推荐
相关产品推荐

