[英]IPC::Open3 converting character encoding
我正在观察IPC :: Open3参数作为脚本一部分的奇怪行为。
我给出一个包含ISO-8859-15的字符串。 就在调用open3()之前(字面上的声明),字符串是正确的(已通过print
和Data::Dumper
验证)。
但是,一旦子进程启动,参数现在将以UTF-8编码。 我已经使用所需的可执行文件(freebcp)和包装器脚本验证了这一点。 我最终写了一个包装器脚本,该脚本将所有参数都转换回ISO-8859-15。
是什么导致这种行为? LANG设置为en_AU.ISO-8859-15。 它可以在其他主机上正常工作。 我找不到对binmode()的任何引用
我有一个包含ISO-8859-15的字符串。 就在
open3()
之前(字面上的声明),字符串是正确的(已通过Data::Dumper
验证)。但是,一旦子进程启动,参数现在将以UTF-8编码。
LANG设置为en_AU.ISO-8859-15。
默认情况下,Perl5不执行任何编码转换:将字符串视为哑字节数组。
也就是说,直到你告诉Perl的字符串包含Unicode的,例如通过调用decode()
或贴有编码层(通过文件句柄读取字符串binmode()
或通过open()
标志,或通过use open
使用:encoding
/ :locale
,或使用-C
开关通过命令行。)
由于您的字符串在ISO-8859-15中,但是以UTF-8输出,因此Perl知道字符串的编码。 您已经以某种方式告诉Perl字符串的编码,并将其转换为Unicode,而该Unicode在内部使用UTF-8表示。 现在似乎已打印到open3()
文件句柄的UTF-8。
作为一种可能的解决方案,在输出字符串之前,应尝试将字符串显式转换为所需的编码。
PS使用utf8::is_utf8()
函数,您可以尝试调试/查找何时/如何将字符串转换为Unicode,以及它们是否真正为Unicode。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.