phu*_*clv 2 character-encoding unicode tr
我正在尝试将一些字符转换为这样的全角形式
tr 'abcdefghijklmnopqrstuvwxyz' '??????????????????????????'
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用。我进行了搜索,结果发现tr
不支持 UTF-8。所以基于那个问题的答案,我尝试使用 perl
tr 'abcdefghijklmnopqrstuvwxyz' '??????????????????????????'
Run Code Online (Sandbox Code Playgroud)
但仍然没有帮助。我尝试了更简单的版本
perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/??????????????????????????/'
Run Code Online (Sandbox Code Playgroud)
似乎 perl 仍然将多字节 UTF-8 字符视为字节
如何正确转换这些字符?
Mic*_*mer 11
GNU 和 BSDsed
在适当的语言环境中都是多字节感知的,y
命令类似于tr
:
$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/??????????????????????????/'
?????
Run Code Online (Sandbox Code Playgroud)
只要您的语言环境是 UTF-8,这应该适用于您可能运行它的大多数地方。
Perl 问题并不像将多字节字符视为字节那么简单。它可以很好地理解您的输入,甚至对输出进行编码,它也是它不理解的源代码:
$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/??????????????????????????/'|hexdump -C
00000000 c3 af c2 bd c2 81 0a |.......|
Run Code Online (Sandbox Code Playgroud)
“?”的 UTF-8 编码 is ef bd 81
,因此您可以看到它将“b”视为第二个字节,然后在输出时对其进行重整以尝试对其进行编码,“c”也是如此。您需要以use utf8
这种方式对 Perl (5) 源代码本身进行编码;-C
仅控制程序在运行时执行的 IO。
你可以把use utf8;
到您的-e
字符串,或者使用-Mutf8
命令行:
$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/??????????????????????????/'
???
Run Code Online (Sandbox Code Playgroud)
Perl 6 确实解决了这个问题,很多,但是......