如何翻译Unicode字符?

如何翻译Unicode字符?

我正在尝试将一些字符转换为全角形式,如下所示

tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'

然而,这不起作用。我进行了搜索,结果发现tr不支持UTF-8。因此,根据该问题的答案,我尝试使用 perl

perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'

但仍然没有帮助。我尝试了更简单的版本

$ echo abca | perl -C -pe 's/a/a/g'
ï½bcï½
$ echo abca | perl -C -pe 'tr/a/a/'
ïbcï

看来perl仍然将多字节UTF-8字符视为字节

如何正确转换这些字符?

答案1

GNU 和 BSDsed在适当的语言环境中都是多字节感知的,并且y命令类似于tr:

$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello

只要您的语言环境是 UTF-8,这应该适用于您可能运行它的大多数地方。


Perl 问题并不像将多字节字符视为字节那么简单。它可以很好地理解您的输入,甚至对输出进行编码,这就是源代码它不明白:

$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000  c3 af c2 bd c2 81 0a                              |.......|

“a”的 UTF-8 编码是ef bd 81,因此您可以看到它将“b”视为第二个字节,然后在输出时尝试对其进行编码,“c”也是如此。你需要use utf8让你的 Perl (5) 源代码本身以这种方式编码;-C只控制程序运行时的IO。

您可以放入字符串use utf8;-e,或​​者-Mutf8在命令行上使用:

$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc

Perl 6 确实解决了这个问题,就像很多问题一样,但是......

相关内容