IPC :: Open3转换字符编码

时间:2015-12-18 08:10:40

标签: perl character-encoding ipcopen3

我正在观察IPC :: Open3参数作为脚本一部分的奇怪行为。

我给出一个包含ISO-8859-15的字符串。就在调用open3()之前(字面意思是之前的语句)字符串是正确的(使用printData::Dumper进行验证)。

然而,一旦启动子进程,参数现在是UTF-8编码的。我已使用所需的可执行文件(freebcp)和包装器脚本验证了这一点。我最终编写了一个包装器脚本,将所有参数转换回ISO-8859-15。

导致这种行为的原因是什么? LANG设置为en_AU.ISO-8859-15。它在其他主机上正常工作。我找不到对binmode()

的任何引用

1 个答案:

答案 0 :(得分:1)

  

我有一个包含ISO-8859-15的字符串。就在调用open3()之前(字面意思是之前的陈述)字符串是正确的(通过printData::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。