作为脚本的一部分,我观察到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()
标志,或通过带有:encoding
/:locale
的use open
,或通过带-C
开关的命令行)
由于字符串是ISO-8859-15格式的,但它是以UTF-8输出的,这意味着Perl知道字符串的编码。不知怎么的,您已经告诉Perl字符串的编码,它已经将其转换为Unicode,Unicode在内部使用UTF-8表示。UTF-8现在似乎已打印到open3()
文件句柄中。
作为一种可能的解决方案,在输出字符串之前,您应该尝试将字符串显式转换为所需的编码。
附言:使用utf8::is_utf8()
函数,您可以尝试调试/查找字符串何时/如何转换为Unicode,以及它们是否真的是Unicode。