我正在尝试将一些字符转换为这样的全角形式
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 字符视为字节
如何正确转换这些字符?
GNU 和 BSD
sed
在适当的语言环境中都是多字节感知的,y
命令类似于tr
:这应该适用于您可能运行它的大多数地方,只要您的语言环境是 UTF-8 语言环境。
Perl 问题并不像将多字节字符视为字节那么简单。它可以很好地理解您的输入,甚至对输出进行编码,这是它不理解的源代码:
"a" 的 UTF-8 编码是
ef bd 81
,因此您可以看到它将 "b" 视为第二个字节,然后在输出时尝试对其进行修改,对于 "c" 也是如此。你需要use utf8
让你的 Perl (5) 源代码本身以这种方式编码;-C
仅控制程序在运行时执行的 IO。您可以放入
use utf8;
您的-e
字符串,或在命令行上使用-Mutf8
:Perl 6 确实解决了这个问题,但...