我正在尝试将一些字符转换为全角形式,如下所示
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 确实解决了这个问题,就像很多问题一样,但是......