我正在观察IPC :: Open3参数作为脚本一部分的奇怪行为。
我给出一个包含ISO-8859-15的字符串。就在调用open3()之前(字面意思是之前的语句)字符串是正确的(使用print
和Data::Dumper
进行验证)。
然而,一旦启动子进程,参数现在是UTF-8编码的。我已使用所需的可执行文件(freebcp)和包装器脚本验证了这一点。我最终编写了一个包装器脚本,将所有参数转换回ISO-8859-15。
导致这种行为的原因是什么? LANG设置为en_AU.ISO-8859-15。它在其他主机上正常工作。我找不到对binmode()
的任何引用答案 0 :(得分:1)
我有一个包含ISO-8859-15的字符串。就在调用
open3()
之前(字面意思是之前的陈述)字符串是正确的(通过Data::Dumper
验证)。但是,一旦子进程启动,参数现在就是UTF-8编码。
LANG设置为en_AU.ISO-8859-15。
默认情况下,Perl5不进行任何编码转换:将字符串视为哑字节数组。
那,直到你告诉Perl字符串包含Unicode,例如通过调用decode()
,或者从附加了编码层的文件句柄中读取字符串(通过binmode()
或通过{{ 1}}标记,或通过open()
use open
/ :encoding
,或通过命令行:locale
切换。)
由于您拥有ISO-8859-15中的字符串,但它以UTF-8输出,这意味着Perl知道您的字符串的编码。在某处你以某种方式告诉Perl字符串的编码,并将其转换为Unicode,使用UTF-8在内部表示。 UTF-8现在似乎打印到-C
文件句柄。
作为一种可能的解决方案,在输出字符串之前,您应该尝试将字符串显式转换为所需的编码。
P.S。使用utf8::is_utf8()
函数,您可以尝试调试/查找字符串何时/如何转换为Unicode,以及它们是否真的是Unicode。