解释文本文件中的 \UXXXXXXXXXX Unicode 代码

Che*_*tar 9 unicode

我有以下文件:

\n
$ cat test\nVilles visit\\U000000e9es\n
Run Code Online (Sandbox Code Playgroud)\n

我如何解释这些\\UXXXXXXXX代码,例如我如何得到:

\n
$ cat test | pipe into something\nVilles visit\xc3\xa9es\n
Run Code Online (Sandbox Code Playgroud)\n

Sté*_*las 8

perl

\n
$ perl -C -pe \'s/\\\\U([[:xdigit:]]{8})/chr hex$1/ge\' <yourfile\nVilles visit\xc3\xa9es\n
Run Code Online (Sandbox Code Playgroud)\n

假设语言环境使用 UTF-8 作为其字符映射\xc2\xb9,则会转换\\UXXXXXXXX为 U+XXXXXXXXX 字符的 UTF-8 编码。要获取 UTF-8O输出而不考虑用户的区域设置,请将 更改-C-CO

\n

要将其转换为\xc3\xa9用户区域设置的正确编码中的字符(假设用户区域设置字符集中有这样的字符):

\n
perl -Mopen=locale -pe \'s/\\\\U([[:xdigit:]]{8})/chr hex$1/ge\' <yourfile\n
Run Code Online (Sandbox Code Playgroud)\n

例如,在语言环境中,会将其转换为 0xe9 字节( ISO8859-1 中fr_CH.iso88591的编码),而在语言环境中,会将其转换为 0x88 0x6d(其在 BIG5-HKSCS 中的编码)。以及语言环境中的 0xc3 0xa9(其 UTF-8 编码)。在语言环境中,由于 ISO8859-6 没有字符,因此您会得到.\xc3\xa9zh_HK.big5hkscsfr_FR.UTF-8ar_AE.iso88596\xc3\xa9Villes visit\\x{00e9}es

\n

或者您可以使用 ICU uconv(在icu-devtools基于 Debian 的系统上的软件包中)来应用Hex/C-Any 转换

\n
uconv -x hex/c-any <your-file\n
Run Code Online (Sandbox Code Playgroud)\n

它可以理解\\uXXXX并以 UTF-8\\UXXXXXXXX进行排序(如果使用 则更多)并输出。hex-any通过管道传递到iconv -f utf-8以获取用户区域设置中的输出(另请参阅跳过无法编码的字符的选项)iconv-c

\n
$ printf \'%s\\n\' \'&#233; &#xe9; \\x{e9} U+00E9 \\u00e9 \\U000000e9 \\U0001F427 \\ud83d\\udc27\' | uconv -x hex/c-any\n&#233; &#xe9; \\x{e9} U+00E9 \xc3\xa9 \xc3\xa9  \n$ printf \'%s\\n\' \'&#233; &#xe9; \\x{e9} U+00E9 \\u00e9 \\U000000e9 \\U0001F427 \\ud83d\\udc27\' | uconv -x hex-any  \n\xc3\xa9 \xc3\xa9 \xc3\xa9 \xc3\xa9 \xc3\xa9 \xc3\xa9  \n
Run Code Online (Sandbox Code Playgroud)\n

(两者都可以识别 java 风格的代理对,但如果它来自 ,则不应出现在输出中cpp -P)。

\n

为了像\那样perl理解两者\\uXXXX,请将 perl 代码更改为:\\UXXXXXXXXuconvhex/c-any

\n
$ perl -C -pe \'s/\\\\U([[:xdigit:]]{8})/chr hex$1/ge\' <yourfile\nVilles visit\xc3\xa9es\n
Run Code Online (Sandbox Code Playgroud)\n

zsh\ 的print内置函数也理解这些\\uXXXXand \\UXXXXXXXX(不需要所有 4/8 数字)以及更多,所以你也可以这样做:

\n
print -- "$(<your-file)"\n
Run Code Online (Sandbox Code Playgroud)\n

如果区域设置的字符映射中不存在字符,您将收到错误消息。

\n

一些printf实现还支持它们的%b格式指令:

\n
printf \'%b\\n\' "$(cat <your-file)"\n
Run Code Online (Sandbox Code Playgroud)\n

与 zsh 一样print,它不仅仅支持\\u/ \\U,至少支持\\n/ \\b/ \\r... ,\\0ooo而且通常更喜欢\\xHH

\n
\n

\xc2\xb9 查看locale charmap命令的输出;在使用其他字符映射的语言环境中,您得到的内容在您的情况下几乎没有用处。如果一行上的所有代码点都在 0x0 .. 0xff 范围内,则获得 ISO8859-1 编码(代码点的字节值),如果不是(如果至少有一个代码点高于 0xff)行中),UTF-8 编码(以及一些关于它的警告)

\n