Unicode

如何翻譯 Unicode 字元?

  • March 11, 2018

我正在嘗試將一些字元轉換為這樣的全形形式

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 和 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 確實解決了這個問題,但…

引用自:https://unix.stackexchange.com/questions/429521