【发布时间】:2011-04-22 13:17:19
【问题描述】:
我有一个外部模块,它返回了一些字符串。我不确定字符串是如何返回的,确切地说。我真的不知道,Unicode 字符串是如何工作的以及为什么。
该模块应返回,例如,捷克语单词“být”,意思是“成为”。 (如果您看不到第二个字母 - 它应该看起来像 this。)如果我使用 Data Dumper 显示模块返回的字符串,我将其视为 b\x{fd}t。
但是,如果我尝试使用print $s 打印它,我会收到“打印中的宽字符”警告,并且?而不是 ý。
如果我尝试Encode::decode(whatever, $s);,无论如何我都无法打印结果字符串(总是带有“宽字符”警告,有时带有错位字符,有时是正确的),无论我在whatever 中输入了什么。
如果我尝试Encode::encode("utf-8", $s);,则可以打印结果字符串而不会出现问题或错误消息。
如果我使用use encoding 'utf8';,则无需任何编码/解码即可打印。 但是,如果我使用IO::CaptureOutput 或Capture::Tiny 模块,它会再次开始喊“宽字符”。
我有几个问题,主要是关于到底发生了什么。 (我试图阅读 perldocs,但我不是很明智)
- 为什么我从模块中获取字符串后不能立即打印?
- 为什么我不能打印通过“decode”解码的字符串? “解码”究竟做了什么?
- “encode”究竟做了什么,为什么编码后打印没有问题?
-
use encoding到底是做什么的?为什么默认编码不同于utf-8? - 如果我想毫无问题地打印标量,即使我想使用其中一个捕获模块,我该怎么做?
编辑:有些人告诉我使用-C 或binmode 或PERL_UNICODE。这是一个很好的建议。然而,不知何故,两个捕获模块都神奇地破坏了 STDOUT 的 UTF8 特性。这似乎更多是模块的错误,但我不太确定。
edit2:好的,最好的解决方案是转储模块并自己编写“捕获”(灵活性要小得多)。
【问题讨论】:
-
你能展示一个演示问题的示例脚本吗?有很多事情要做,所以很容易从具体的事情开始。
-
并且,当您拥有简短的示例脚本时,可以使用它向RT 上的那些模块报告错误。