尽管要求使用 UTF-8 对其进行编码,但 Perl 输出仍不可读

问题描述

正如我的问题标题所示,我使用 Perl 来执行一些与正则表达式相关的查询。但是,我在正文中使用带有变音符号的 UTF8 编码输入,当我生成输出时,它总是 UTF-16 LE/UCS-2 LE BOM 编码。

我的主要问题是输入中的变音符号被替换为“??”在输出中。我认为这个问题在于编码。我试图删除很多可能导致我的问题的代码,但问题仍然存在。

这是我的代码

use utf8;  # Source is encoded using UTF-8
use open ':std',':encoding(locale)';

对于本网站上类似问题的其他几个答案的建议,我已多次更改:

我试过这个选项:

Cannot find encoding "locale" at /usr/share/perl5/core_perl/open.pm line 126.
Cannot find encoding "locale" at /usr/share/perl5/core_perl/open.pm line 134.

这导致我的 CLI 声明

-CDSL -le 'print "\x{1815}"'
-CO

我还尝试在 CLI 中运行在命令末尾标记的以下选项:

binmode(STDOUT,":utf8");
use open ":encoding(utf8)";
use open IN => ":encoding(utf8)",OUT => ":utf8";

我在代码中放入的更多行没有成功:

export PERL_UNICODE=SDL

也有人推荐使用

'环境'

但我找不到任何关于我将如何做到的信息。他建议的代码是:

id|field1|field2|field3
--|------|------|------
1 |   b  |  f   |  z
2 |   q  |  q   |  q

但我不知道该把它放在哪里或更改它。

希望有人能帮我解决这个问题。

解决方法

您显示的输出似乎不是您声称的 UTF-16 或 UCS-2。 (? 太少了。)也没有 BOM 的证据。

另一方面,输出与UTF-8一致。 éèàòôëàö 都编码为使用 UTF-8 的两个字节。

Perl 完全按照您的要求执行,但是您正在使用需要不同编码的工具或终端查看 UTF-8。您需要为您的工具或终端提供正确的编码,或者调整您的工具或终端的预期。

例如,您可以使用 chcp 65001 告诉 Windows 控制台期望使用 UTF-8。

由于您完全没有提供有关您的工具或终端的信息,因此我们只能提供帮助。