perl - 用于 HTML 的 Perl 多字节字符编码
问题描述
我正在传递一个字符串,例如:
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::encode
and HTML::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
添加use utf8;
.
- ASCII 的 8 位干净版本,这意味着在字符串或正则表达式文字中设置了第 8 位的任何字节都会产生具有相同值的字符。
推荐阅读
- reactjs - 反应中的onClick函数不适用于条件
- cqrs - 使用 MediatR/CQRS 的嵌套查询
- angular - Angular2 +双向绑定导致兄弟在初始化时更新
- vue.js - Nuxt / Vuex / Vue 反应性问题增量
- java - 在文件路径中找不到 Futronic sdk ftscanapi 库
- scala - 如何在多模块 gradle 项目中仅编译已更改(或相关)的模块
- python - Python-3.x:如何在等列中打印多个列表?
- sql - SQL Server:使用大小写设置变量
- animation - 应用程序启动后如何为小部件设置动画
- bootstrap-table - Bootstrap,仅用于指定列的表剥离类