gpt4 book ai didi

用于 HTML 的 Perl 多字节字符编码

转载 作者:行者123 更新时间:2023-12-02 07:59:00 24 4
gpt4 key购买 nike

我正在传递一个字符串,例如:

my $x = "Zakłady Kuźnicze";

如果仔细观察,您会发现这两个奇怪的字母实际上由两个字节组成:

foreach (split(//, $x)) { print $_.' '.ord($_)."\n"; }

Z 90
a 97
k 107
� 197
� 130
a 97
d 100
y 121
32
K 75
u 117
� 197
� 186
n 110
i 105
c 99
z 122
e 101

我想使用此处描述的代码将其转换为编码的 HTML:https://www.w3schools.com/charsets/ref_utf_latin_extended_a.asp

所以我需要这样一个函数:

print encode_it($x)."\n";

产量:

Zakłady Kužnice

我试过 HTML::Entities::encodeHTML::Entities::encode_numeric,但这些结果:

Zakłady Kuźnicze

Zakłady Kuźnicze

这没有帮助,它呈现为:

Zakłady Kuźnicze

谁能建议如何实现这一点?

编辑:

就像 ikegami 展示的那样,如果使用 use utf8 并且在程序中设置了字符串,它就可以工作:

perl -e 'use utf8; chomp; printf "%X\n", ord for split //, "Zakłady Kuźnicze"'
5A
61
6B
142
61
64
79
20
4B
75
17A
6E
69
63
7A
65

...但我的输入实际上是通过 STDIN 输入的,而它在 STDIN 中不起作用:

echo "Zakłady Kuźnicze" | perl -ne 'use utf8; chomp; printf "%X\n", ord for split //'
5A
61
6B
C5
82
61
64
79
20
4B
75
C5
BA
6E
69
63
7A
65

我在这里缺少什么微妙之处?

最佳答案

Perl 期望源是 ASCII[1](no utf8;,默认值)或 UTF-8(use utf8;).你似乎有一个使用 UTF-8 编码的文件,但你没有告诉 Perl,所以它看到了

my $x = "Zak\xC5\x82ady Ku\xC5\xBAnicze";

而不是预期的

my $x = "Zak\x{142}ady Ku\x{17A}nicze";

示例(UTF-8 终端):

$ diff -U 0 \
<( perl -e'no utf8; printf "%X\n", ord for split //, "Zakłady Kuźnicze"' ) \
<( perl -e'use utf8; printf "%X\n", ord for split //, "Zakłady Kuźnicze"' )
--- /dev/fd/63 2020-01-17 20:04:23.407591294 -0800
+++ /dev/fd/62 2020-01-17 20:04:23.407591294 -0800
@@ -4,2 +4 @@
-C5
-82
+142
@@ -12,2 +11 @@
-C5
-BA
+17A

添加使用utf8;


  1. ASCII 的 8 位干净版本,这意味着在字符串或正则表达式文字中设置第 8 位的任何字节都会产生具有相同值的字符。

关于用于 HTML 的 Perl 多字节字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797149/

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