返回

如何在 \*nix 中将 \uXXXX Unicode 转义序列轻松转换为 UTF-8?

Linux

在 *nix 中将 \uXXXX Unicode 转换为 UTF-8

问题

如果你处理过来自 Web 服务的 JSON 响应,你可能已经遇到过包含 \uXXXX Unicode 转义序列的字符串。这些转义序列表示非 ASCII 字符,但并不总是以人类可读的方式显示。

解决方案

将 \uXXXX Unicode 转换为 UTF-8 有几种方法。我们来看几个常用的命令行工具:

iconv

iconv 命令可以将文本从一种编码转换为另一种编码。要将 Unicode 转义序列转换为 UTF-8,可以使用以下命令:

echo '\u0144\u00f3' | iconv -f Unicode -t UTF-8

jq

如果您正在处理 JSON 响应,可以使用 jq 命令来提取和转换 Unicode 转义序列。例如:

curl -s https://example.com/api/v1/data.json | jq -rnc --stream 'fromstream(1|truncate_stream(inputs)) | .text | gsub("\\\\u([0-9a-fA-F]{4})"; "\\u\\1" | fromjson)'

sed

sed 命令也可以用来替换 Unicode 转义序列。可以使用以下命令:

echo '\u0144\u00f3' | sed 's/\\u([0-9a-fA-F]{4})/\\u\1/' | sed 's/\\u\([0-9a-fA-F]{4})\([0-9a-fA-F]{4})\([0-9a-fA-F]{4})\([0-9a-fA-F]{4})/\\U\1\2\3\4/g'

python

如果你熟悉 Python,可以使用以下代码来转换 Unicode 转义序列:

import re

def unicode_to_utf8(s):
    """Convert unicode escapes to UTF-8"""
    return re.sub(r'\\u([0-9a-fA-F]{4})', lambda m: chr(int(m.group(1), 16)), s)

print(unicode_to_utf8('\u0144\u00f3'))

常见问题解答

1. 为什么需要转换 Unicode 转义序列?
Unicode 转义序列用于表示非 ASCII 字符,但并不总是以人类可读的方式显示。转换这些序列对于在各种应用程序和系统中正确显示文本非常重要。

2. 哪种方法是最好的?
最佳方法取决于具体情况。对于简单的文本转换,iconv 是一个不错的选择。对于 JSON 响应,jq 提供了一种更强大的方法。

3. 我可以在文件中转换 Unicode 转义序列吗?
是的,可以使用 iconv 命令将文件中的 Unicode 转义序列转换为 UTF-8:

iconv -f Unicode -t UTF-8 input.txt > output.txt

4. 我可以使用其他工具吗?
有很多其他工具可以用于转换 Unicode 转义序列,例如 perlawkruby

5. 我应该小心什么?
确保你使用的是支持 Unicode 的命令行工具。另外,有些字符可能需要额外的处理,例如使用 utf8mb4 字符集的 MySQL 数据库。