如何在多个文件中用UTF-8字符替换Unicode代码?

如何在多个文件中用UTF-8字符替换Unicode代码?

我有 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被解释为换页\u123as ǵ、 while\d\u(ser) 没有解释。

相关内容