gpt4 book ai didi

perl - perl中的Unicode字符串困惑

转载 作者:行者123 更新时间:2023-12-01 16:33:47 24 4
gpt4 key购买 nike

我有一个外部模块,它返回了一些字符串。我不确定字符串是如何返回的,确切地说。我真的不知道,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::CaptureOutputCapture::Tiny 模块,它又开始喊“Wide character”。

我有几个问题,主要是关于到底发生了什么。 (我试图阅读 perldocs,但我不是很明智)

  1. 为什么我从模块中获取字符串后不能立即打印?
  2. 为什么我不能打印通过“decode”解码的字符串? “解码”究竟做了什么?
  3. “encode”究竟做了什么,为什么编码后打印没有问题?
  4. 使用编码究竟是做什么的?为什么默认编码与 utf-8 不同?
  5. 如果我想毫无问题地打印标量,即使我想使用其中一个捕获模块,我该怎么做?

edit:有些人告诉我使用 -CbinmodePERL_UNICODE。这是一个很好的建议。然而,不知何故,两个捕获模块都神奇地破坏了 STDOUT 的 UTF8 特性。这似乎更多是模块的错误,但我不太确定。

edit2:好的,最好的解决方案是转储模块并自己编写“捕获”(灵 active 要小得多)。

最佳答案

  1. 因为您以 perl 的内部形式 (utf8) 将字符串输出到非 unicode 文件句柄。
  2. decode 函数将假定为 ENCODING 的字节序列解码为 Perl 的内部格式 (utf8)。您的输入似乎已被解码,
  3. encode() 函数将 Perl 内部形式的字符串编码为 ENCODING。
  4. encoding pragma 允许您以您喜欢的任何编码编写脚本。字符串文字会自动转换为 perl 的内部形式。
  5. 确保 perl 知道您的数据输入和输出的编码。

另见 perluniintro、perlunicode、编码模块、binmode() 函数。

关于perl - perl中的Unicode字符串困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3885065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com