将具有 UTF-8 代码的八进制转义的 ASCII 文件转换为 UTF-8

将具有 UTF-8 代码的八进制转义的 ASCII 文件转换为 UTF-8
  1. 我有一个文本文件,它本身是一个 ASCII 文件,但包含表示 utf-8 代码的八进制转义序列:

    \350\207\252\345\212\250\346\216
    

    是否有一些程序或命令可以将此类 ASCII 文件转换为实际以 utf-8 编码的文本文件?

  2. 顺便一提,这个网站是“在线 ASCII(Unicode Escaped) 到 Unicode(UTF-8) 转换器工具”,并且这个网站是“在线 Unicode(UTF-8) 到 ASCII(Unicode Escaped) 转换器工具”。他们会在我的问题中进行转换吗?如果不是,他们会进行什么样的转换?

答案1

如果 shell 变量、dash、mksh 或 bash 中有这些转义序列:

printf %b "$string_with_backslash_escapes"

这不是 POSIX:说明符是 POSIX,但每个反斜杠后面都%b需要一个。0这也解释了其他反斜杠转义:\n作为换行符、\t作为制表符等。

这是一个仅转换八进制转义序列的 Perl 单行代码。

perl -pe 's[\\(?:([0-7]{1,3})|(.))] [defined($1) ? chr(oct($1)) : $2]eg'

http://www.rapidmonkey.com/unicodeconverter/reverse.jsp将八进制值解释为 Latin-1 字符,我不知道为什么页面中提到 Unicode 和 UTF-8。我不知道什么http://www.rapidmonkey.com/unicodeconverter/advanced.jsp做。

答案2

仅使用重击:

3.1.2.4 ANSI-C 引用

该形式的单词$'string'经过特殊处理。这个词扩展为 细绳,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

……

<i>nnn值为八进制值的八位字符恩恩(一到三位数)

在UTF-8终端中演示:

$ echo $'\350\207\252\345\212\250\346\216'
自动?

最后一个字符显示为问号,因为序列格式错误:仅存在三个必需字节中的两个。


您链接到的网站执行RFC 5137编码/解码。

如果您\u81ea\u52a8在“ASCII (Unicode Escaped)”文本区域中输入,您将得到自动输出,因为是 Unicode 字符U+81EA(其 UTF-8 表示形式为十六进制的 e8 87 aa,或八进制的 350 207 252)并且是 Unicode 字符U+52A8(其 UTF-8 表示为十六进制的 e5 8a a8,或八进制的 345 212 250)。

答案3

交互式 shell 中的 Python 至少可以完成其中的一些工作。但上面的序列似乎已损坏:

wilmer@ruby:~$ python
Python 2.7.10(默认,2015 年 7 月 1 日,10:54:53)
[GCC 4.9.2] 在 linux2 上
输入“帮助”、“版权”、“制作人员”或“许可证”以获取更多信息。
>>> unicode("\350\207\252\345\212\250\346\216", "utf-8")
回溯(最近一次调用最后一次):
  文件“”,第 1 行,位于
UnicodeDecodeError:“utf8”编解码器无法解码位置 6-7 中的字节:数据意外结束
>>> unicode("\350\207\252\345\212\250", "utf-8")
你'\u81ea\u52a8'
>>> 打印 unicode("\350\207\252\345\212\250", "utf-8")
自动

答案4

我想补充一点,使用某些软件可能就足够了选择、复制、粘贴转义的文本。例如,Wireshark 将 UTF-8 文本显示为八进制转义字节序列,但是当您将其复制并粘贴到 Gedit 中时,您会得到普通文本,例如 \341\203\231 变成 კ。

相关内容