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

Tim*_*Tim 10 character-encoding text-processing

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

    \350\207\252\345\212\250\346\216
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 顺便说一下,本站是“在线 ASCII(Unicode Escaped) 到 Unicode(UTF-8) 转换工具”,本站是“在线 Unicode(UTF-8) 到 ASCII(Unicode Escaped) 转换工具”。他们是否在我的问题中进行了转换?如果不是,他们进行了哪些类型的转换?

Gil*_*il' 9

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

printf %b "$string_with_backslash_escapes"
Run Code Online (Sandbox Code Playgroud)

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

这是一个仅转换八进制转义序列的 perl one-liner。

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

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


200*_*ess 5

仅使用Bash

\n
\n

3.1.2.4 ANSI-C 引用

\n

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

\n

\xe2\x80\xa6

\n

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

\n
\n

在UTF-8终端中演示:

\n
$ echo $\'\\350\\207\\252\\345\\212\\250\\346\\216\'\n\xe8\x87\xaa\xe5\x8a\xa8?\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

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

\n

如果您\\u81ea\\u52a8在“ASCII (Unicode Escaped)”文本区域中输入,您将得到\xe8\x87\xaa\xe5\x8a\xa8输出,因为\xe8\x87\xaaUnicode 字符U+81EA(其 UTF-8 表示形式为十六进制的 e8\xc2\xa087\xc2\xa0aa,或者350\xc2\xa0207\xc2\xa0252(八进制),\xe5\x8a\xa8是 Unicode 字符U+52A8(其 UTF-8 表示为十六进制的 e5\xc2\xa08a\xc2\xa0a8,或八进制的 345\xc2\xa0212\xc2\xa0250 )。

\n


Wil*_*mer 3

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

\n\n
\nwilmer@ruby:~$ python\nPython 2.7.10(默认,2015 年 7 月 1 日,10:54:53)\n[GCC 4.9.2] on linux2\n输入“help”、“copyright”、“credits”或\n>>> unicode("\\350\\207\\252\\345\\212\\250\\346\\216", "utf-8")\nTraceback (最近一次调用最后):\n 文件“”,第 1 行,\nUnicodeDecodeError:\'utf8\' 编解码器无法解码位置 6-7 中的字节:数据意外结束\n>>> unicode("\ \350\\207\\252\\345\\212\\250","utf-8")\nu\'\\u81ea\\u52a8\'\n>>> print unicode("\\350\ \207\\252\\345\\212\\250","utf-8")\n\xe8\x87\xaa\xe5\x8a\xa8\n
\n