Character-Encoding

將 UTF-8 文件轉換為 ASCII(盡力而為)

  • September 10, 2019

我有一個 UTF-8 文件,其中包含多種語言的文本。很多都是人名。我需要將其轉換為 ASCII,並且我需要使結果看起來盡可能體面。

有很多方法可以將更寬的編碼轉換為更窄的編碼。最簡單的轉換是將所有非 ASCII 字元替換為某個佔位符,例如“_”。如果我知道文件的編寫語言,還有其他可能性,例如羅馬化。

Unix 上可用的 Unix 工具或程式語言庫可以為我提供從 UTF-8 到 ASCII 的體面(盡力)轉換?

大部分文本是基於歐洲拉丁類型的語言。

konwert utf8-ascii

它將根據轉換錶進行盡力轉換。如果您大致了解輸入語言,則可以使用特定於語言的過濾器提供更好的結果,例如

konwert utf8-xmetodo

是將世界語轉換為 x-metodo 表示,

konwert UTF8-tex

將嘗試對變音符號進行 TeX 表示,有語言特定的參數:

konwert UTF8-ascii/de

將“ä”音譯成“ae”(德語習慣)而不是簡單的“a”

konwert UTF8-ascii/rosyjski

將使用波蘭語規則來音譯俄語,而不是“類似英語”的規則,等等……

這將適用於某些事情:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT返回helloe ?。任何iconv不知道如何轉換的字元都將替換為問號。

iconv是POSIX,但我不知道是否所有系統都有TRANSLIT選項。它適用於我在 Linux 上。此外,該IGNORE選項將默默地丟棄無法在目標字元集中表示的字元(請參閱 參考資料man iconv_open)。

一個劣質但符合 POSIX 的選項是使用tr. 此命令用問號替換所有非 ASCII 程式碼點。它一次讀取一個字節的 UTF-8 文本。“É”可能會被替換為E??,這取決於它是使用組合重音還是預先組合的字元進行編碼的。

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

該範例caf? ?????使用預先組合的字元返回 。

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