IPC::Open3转换字符编码



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

我给出一个包含ISO-8859-15的字符串。就在调用open3()之前(实际上是之前的语句),字符串是正确的(用printData::Dumper验证)。

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

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

我有一个包含ISO-8859-15的字符串。就在调用open3()(字面上是之前的语句)之前,字符串是正确的(用printData::Dumper验证)。

但是,一旦启动了子流程,参数现在都是UTF-8编码的。

LANG设置为en_AU.ISO-8859-15。

Perl5默认不进行任何编码转换:字符串被视为哑字节数组。

直到您告诉Perl字符串包含Unicode,例如通过调用decode(),或从附加了编码层的文件句柄读取字符串(通过binmode(),或通过open()标志,或通过带有:encoding/:localeuse open,或通过带-C开关的命令行)

由于字符串是ISO-8859-15格式的,但它是以UTF-8输出的,这意味着Perl知道字符串的编码。不知怎么的,您已经告诉Perl字符串的编码,它已经将其转换为Unicode,Unicode在内部使用UTF-8表示。UTF-8现在似乎已打印到open3()文件句柄中。

作为一种可能的解决方案,在输出字符串之前,您应该尝试将字符串显式转换为所需的编码。

附言:使用utf8::is_utf8()函数,您可以尝试调试/查找字符串何时/如何转换为Unicode,以及它们是否真的是Unicode。

最新更新