Unicode

如何在多個文件中用 UTF-8 字元替換 Unicode 程式碼數字?

  • April 12, 2021

我有 500 個包含轉義 Unicode 字元的文件,如下所示:

Albert Vel\u00e1zquez
V\u00e9ronique Ekin

等等。數據是通過腳本通過XMLHttpRequests 從伺服器查詢的,我假設引用的類型源於那裡。

如您所見,每個都\u00xx需要替換為相應的特殊字元:

\u00e1 -> á
\u00e9 -> é

等等

問題:如何在所有文件中以非互動方式用它們各自的 UTF-8 對應物替換這些程式碼序列?

Unicode 程式碼點似乎都是 8 位的,但無法檢查所有出現(太多)。也許多字節字元會顯示為\u00xx\u00yy?或者\uxxyy,如果這是某種 7 位乾淨的 UTF-16?我希望這裡有人能辨識字元表示(我在網上找不到)並且可以推荐一個正確處理多字節序列的腳本。

編輯:請注意,iconv無法處理文件格式:

# iconv --list | wc -l
1179

iconv知道 1179 種編碼。試一試:

# foreach enc ( `iconv --list | tr -d /` )
foreach? echo ==== $enc >> enctest
foreach? echo 'Vel\u00e1zquez' | iconv -f $enc -t UTF-8 >> enctest
foreach? end
# grep -a --before=1 Velázquez enctest
Exit 1

該文件不包含正確的字元串:-(

一種選擇是通過echo(或printf)解析它。

#!/bin/bash
IFS=
while read -r line ; do
 printf '%b\n' "$line"
 #or: echo -e "$line"
 #or: printf "$line\n"
done <infile >outfile

警告:此方法將解釋所有轉義字元!因此,僅當反斜杠的唯一出現是針對 unicode 字元或 uniterpretable 時,它才會起作用。

例子

$file infile
input:  ASCII text
$cat infile
Albert Vel\u00e1zquez
V\u00e9ronique Ekin
DOS Path: C:\data\user\file\u123.txt

$file outfile
outfile: UTF-8 Unicode text
$cat outfile
Albert Velázquez
Véronique Ekin
DOS Path: C:\data\user
                     ileǵ.txt

where\f被解釋為form feed\u123as ǵ, while\d\u(ser) 沒有解釋。

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