0

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

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

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

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

4

1 回答 1

1

我有一个包含 ISO-8859-15 的字符串。就在open3()调用之前(字面意思是之前的语句)字符串是正确的(用printand验证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,它在内部使用 UTF-8 表示。现在似乎打印到open3()文件句柄的 UTF-8。

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

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

于 2015-12-21T23:19:52.857 回答