繁体   English   中英

IPC :: Open3转换字符编码

[英]IPC::Open3 converting character encoding

我正在观察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()标志,或通过use open使用:encoding / :locale ,或使用-C开关通过命令行。)

由于您的字符串在ISO-8859-15中,但是以UTF-8输出,因此Perl知道字符串的编码。 您已经以某种方式告诉Perl字符串的编码,并将其转换为Unicode,而该Unicode在内部使用UTF-8表示。 现在似乎已打印到open3()文件句柄的UTF-8。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM