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-java | Java 语言形式的转义,用以下格式的字符串来替换缺失的字符:对于平面 0 的字符,使用 \uhhhh;对于平面 1 及以上的字符,使用 \uhhhh\uhhhh,其中 hhhh 是表示该字符的 UTF-16 码元的十六进制值。平面 1 及以上的字符以一对 UTF-16 代理码元的形式书写 |
| escape-c | C/C++ 语言形式的转义,用以下格式的字符串来替换缺失的字符:对于平面 0 的字符,使用 \uhhhh;对于平面 1 及以上的字符,使用 \Uhhhhhhhh,其中 hhhhhhhh 是表示该字符的 Unicode 码点的十六进制值。 |
escape-xml | 相当于使用 escape-xml-hex 回调 |
escape-xml-hex | 如果缺失的字符对应一个 Unicode 码点,则转换为 nnnn吗, nnnn 为 Unicode 码点的十六进制值 |
escape-xml-dec | 如果缺失的字符对应一个 Unicode 码点,则转换为 nnnn吗, nnnn 为 Unicode 码点的十进制值 |
escape-unicode | 用格式为 {U+hhhh} 的字符串来替换缺失的字符,其中 hhhh 是 Unicode 码点的十六进制值。这个十六进制字符串的长度是可变的,可以使用 4 到 6 个数字 |
结语
uconv 是 Linux、Unix 系统下的一款专业级编码处理工具,相比于 iconv,它提供了更加丰富的编码支持,同时提供了灵活的错误回调机制,是非常好用的一款编码转换工具。