首页>教程>Linux 命令手册> 文件内容查看与处理 >Linux uconv 命令 - Unicode 编码文本转换工具

Linux uconv 命令 - Unicode 编码文本转换工具

uconv 命令(英文全称为 Unicode convert)是用于 Unicode 编码转换的命令,可以将文件或标准输入中字符的编码转换为另一种形式的编码,在转换的过程中会以 Unicode 作为中间编码,支持 Unicode 音译转换,可以自定义遇到无效字符时的回调处理。

安装 uconv

在多数的 Linux 发行版中没有预装 uconv 命令,根据不同的发行版使用如下的命令安装 uconv

Debian / Ubuntu 系统安装 uconv

1)更新软件源

sudo apt update

2)在 Debian / Ubuntu 系发行版中 uconv 命令包含在 icu-devtools 软件包中,使用如下命令安装 uconv:

sudo apt install -y icu-devtools

RHEL / AlmaLinux / Rocky Linux 系统安装 uconv

1)更新软件源

sudo dnf check-update

2)在 RHEL / AlmaLinux / Rocky Linux 系发行版中 uconv 命令包含在 icu 软件包中,使用如下命令安装 uconv:

sudo dnf install -y icu

相似命令对比

  • iconv: 系统自带的基础的转码工具,支持的编码比较少、没有音译与 Unicode 规范化的能力
  • uconv: 基于 ICU,支持数百种的编码和音译规则,支持 Unicode 规范化,功能非常的全面

uconv 命令语法结构

uconv 命令的语法结构简单易懂,具体语法形式为:

uconv [选项] [文件...]

语法组成的说明:

  • [选项]: 可选的内容,用于控制转码行为、编码设置、回调规则、音译规则等。
  • [文件...]: 待转码文件,如果不指定则从标准输入读取内容

uconv 命令示例

如下给出一些 uconv 命令的使用示例,更加简明的说明如何使用 uconv 命令。

指定源编码转系统默认编码

使用 -f 选项指定源文件的编码,当不指定需要转换的编码时,转换为系统默认使用的编码:

uconv -f GBK test.txt

校验文件编码的有效性

使用 -c 选项跳过无效字符并继续处理文件,同时输出无效字符的信息:

uconv -f UTF-8 -c test.txt

如果没有任何的输出,则表示文件的编码正常。

UTF-8 转其他编码并兼容 HTML

使用 -t 指定目标编码,使用 --callback 指定回调函数处理无效字符:

uconv -f utf-8 -t GB2312 --callback escape-xml-dec test.txt

该示例指定 escape-xml-dec 回调处理,把缺失的字符替换为 XML 十进制实体字符,具体请查看回调说明,适配网页中使用。

uconv 命令选项

uconv 命令提供了很多的选项可供使用,如下给出其解释说明:

选项功能描述
-h, -?, --help输出帮助信息并退出
-V, --version显示版本信息并退出
-s, --silent启用静默执行,不输出提示信息
-v, --verbose输出详细的执行过程信息
-l, --list列出所有的支持的编码
-l CODE, --list-code CODE只列出指定的编码信息
--default-code显示系统默认的编码名称
-L, --list-transliterators列出所有的支持的音译器
--canon如何和 -l--list--default-code 一起使用,列出兼容 convrtrs.txt 格式的编码;如果与 -L--list-transliterators 一起使用,每行输出一个音译器
-x transliteration对转码后的 Unicode 数据执行给定的转写操作,并将转写的数据作为输入进行转码
--to-callback callback使用回调来处理无法转码到目标编码的字符名
-c跳过无效字符,继续处理内容,但会在标准输出上输出相应的信息,等价于使用 --to-callback skip 选项
--from-callback callback使用回调函数来处理无法从原始编码转换的字符名
-i忽略输入中的无效序列,等价于使用 --from-callback skip 选项
--callback callback统一设置输入 / 输出中 处理无效字符的回调
--fallback当从 Unicode 转换为目标编码时使用 fallback 映射
--no-fallback禁用 fallback 映射,该选项为默认值
-b, --block-size size设置每次读取输入块大小的字节数,默认为 4096
-f, --from-code encoding指定输入数据的编码
-t, --to-code encoding指定输出数据的编码
--add-signature如果输出的字符集支持 U+FEFF 形式的 Unicode 标识字符(BOM)但没有添加该字符,则自动添加该字符。
--remove-signature移除输入中的 U+FEFF BOM 标识字符
-o, --output file将转换的数据输出到指定的文件中,默认输出到标准输出

回调说明

回调称为 CALLBACK,是 uconv 处理无效字符或无法转码字符的一个机制,用于解决以下的两个问题:

  • 无法把输入数据中的编码字符转换为 Unicode 字符,使用 --from-callback 选项来设置回调处理
  • 无法把 Unicode 字符转换为输出数据中的编码字符,使用 --to-callback 选项来设置回调处理

uconv 默认使用 stop 回调,即遇到无效数据直接报错终止处理;使用其他指定的回调可以实现跳过、替换、转义等灵活处理方式。

回调名称功能作用
substitute自动替换无效字符:
→ 转码到 Unicode 时,使用标准替换符 U+FFFD
→ 转码到其他编码时,使用对应编码的默认替换序列
skip直接忽略、丢弃所有的无效数据或无法转码的字符
stop默认使用的回调,遇到无效的数据时,立即停止转码并抛出相应的错误
escape等同于使用 escape-icu 回调
escape-icu用以下格式的字符串来替换缺失的字符:对于平面 0 的字符,使用 %Uhhhh;对于平面 1 及以上的字符,使用 %Uhhhh%Uhhhh,其中 hhhh 是表示该字符的 UTF-16 码点的十六进制值。平面 1 及以上的字符以一对 UTF-16 代理码元的形式书写
escape-javaJava 语言形式的转义,用以下格式的字符串来替换缺失的字符:对于平面 0 的字符,使用 \uhhhh;对于平面 1 及以上的字符,使用 \uhhhh\uhhhh,其中 hhhh 是表示该字符的 UTF-16 码元的十六进制值。平面 1 及以上的字符以一对 UTF-16 代理码元的形式书写
escape-cC/C++ 语言形式的转义,用以下格式的字符串来替换缺失的字符:对于平面 0 的字符,使用 \uhhhh;对于平面 1 及以上的字符,使用 \Uhhhhhhhh,其中 hhhhhhhh 是表示该字符的 Unicode 码点的十六进制值。
escape-xml相当于使用 escape-xml-hex 回调
escape-xml-hex如果缺失的字符对应一个 Unicode 码点,则转换为 &#xnnnn吗, nnnn 为 Unicode 码点的十六进制值
escape-xml-dec如果缺失的字符对应一个 Unicode 码点,则转换为 &#nnnn吗, nnnn 为 Unicode 码点的十进制值
escape-unicode用格式为 {U+hhhh} 的字符串来替换缺失的字符,其中 hhhh 是 Unicode 码点的十六进制值。这个十六进制字符串的长度是可变的,可以使用 4 到 6 个数字

结语

uconv 是 Linux、Unix 系统下的一款专业级编码处理工具,相比于 iconv,它提供了更加丰富的编码支持,同时提供了灵活的错误回调机制,是非常好用的一款编码转换工具。