在 Windows 上替换 UTF-8 字符串的 Perl 问题

Perl problem with substituting UTF-8 string on windows

提问人:Vojta Havránek 提问时间:5/28/2023 最后编辑:Simon MourierVojta Havránek 更新时间:5/29/2023 访问量:77

问:

我正在尝试使用命令行在 Windows 10 上用 Perl 替换文本文件中的子字符串。

C:\Windows\System32\chcp 65001 & type test.txt | c:\Strawberry\perl\bin\perl -CSD -pe "use open ':std', ':encoding(UTF-8)'; binmode(STDOUT, ':utf8'); binmode(STDIN, ':encoding(utf8)'); s/__compare_loan__/So sánh sản phẩm cho vay/g" 

文件测试.txt(保存为 UTF-8):

我们的优势:__compare_loan__

输出:

活动代码页:65001 我们的优势: So sánh s?n ph?m cho vay

如果我在 Perl 脚本的开头添加,我会得到:use utf8;

活动代码页:65001 格式错误的 UTF-8 字符:\xe1\x6e\x68 (意外的非延续字节0x6e,紧跟在开始字节之后 0xe1;需要 3 个字节,在 -e 行 1 处得到 1)。格式错误的 UTF-8 字符 (致命)在 -e 行 1 处。

请知道如何摆脱输出中的问号?

Windows Perl 批处理文件 UTF-8

评论

0赞 ikegami 5/29/2023
Win 11 shell 对我有用,没有问题。如果首先将 chcp 65001 用作单独的命令,是否有帮助?您是键入/粘贴命令,还是将其保存在.cmd文件或.bat文件中?您使用的是 cmd shell 还是 PowerShell?use utf8;cmd
1赞 Vojta Havránek 5/30/2023
我使用了 Win 10 cmd 和 PowerShell,结果相同。我复制粘贴了命令。单独使用 chcp 没有帮助。

答:

4赞 Shawn 5/29/2023 #1

当您添加到一行时,该错误表明 perl 的参数是在 CP-1252 或类似的代码页中给出的,而不是在 UTF-8 中给出的(CP-1252 中的0xE1是 á,0x6E 是 n,0x68 是 h)。use utf8;

一个可移植的解决方法是使用字符转义,而不是尝试直接包含非 ASCII 字符:

C:\Code\SO> chcp 65001 & type test.txt | perl -CSD -pe "s/__compare_loan__/So s\x{e1}nh s\x{1ea3}n ph\x{1ea9}m cho vay/g"
Active code page: 65001
Our benefit: So sánh sản phẩm cho vay

(使用 Strawberry Perl 5.32.1 和标准 Windows 10 命令提示符应用程序进行测试)

请注意,使用意味着你不需要所有这些东西;这一切都由参数暗示。-CSDuse openbinmode-C

评论

0赞 Vojta Havránek 5/30/2023
谢谢。我认为转义字符对我来说是不切实际的,因为我正在通过 Google 表格中的公式逐行为许多字符串创建 shell 命令(用于源代码的本地化)。有没有办法控制我在命令行上传递参数的编码?