提问人:Vojta Havránek 提问时间:5/28/2023 最后编辑:Simon MourierVojta Havránek 更新时间:5/29/2023 访问量:77
在 Windows 上替换 UTF-8 字符串的 Perl 问题
Perl problem with substituting UTF-8 string on windows
问:
我正在尝试使用命令行在 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 处。
请知道如何摆脱输出中的问号?
答:
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 命令提示符应用程序进行测试)
请注意,使用意味着你不需要所有这些东西;这一切都由参数暗示。-CSD
use open
binmode
-C
评论
0赞
Vojta Havránek
5/30/2023
谢谢。我认为转义字符对我来说是不切实际的,因为我正在通过 Google 表格中的公式逐行为许多字符串创建 shell 命令(用于源代码的本地化)。有没有办法控制我在命令行上传递参数的编码?
评论
use utf8;
cmd