Unicode
如何翻譯 Unicode 字元?
我正在嘗試將一些字元轉換為這樣的全形形式
tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'
但是,它不起作用。我進行了搜尋,結果發現
tr
它不支持 UTF-8。因此,根據該問題的答案,我嘗試使用 perlperl -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
:$ 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 確實解決了這個問題,但…