我有 500 个包含转义 Unicode 字符的文件,如下所示:
Albert Vel\u00e1zquez
V\u00e9ronique Ekin
数据是通过脚本通过 s 从服务器查询的XMLHttpRequest
,我假设引用的类型源于那里。
正如您所看到的,每个字符都\u00xx
需要替换为各自的特殊字符:
\u00e1 -> á
\u00e9 -> é
ETC。
问题:如何在所有文件中以非交互方式将这些代码序列替换为其各自的 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
该文件不包含正确的字符串:-(
答案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 字符或不可解释的。
例子
$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
其中\f
被解释为换页、\u123
as ǵ
、 while\d
和\u
(ser) 没有解释。