我经常遇到代表UTF-16BE的字符串,例如\u0444\u0430\u0439\u043b
,它会正确呈现为файл
。
我想知道:有没有一种简单的方法可以使用sed或其他命令行工具“渲染”UTF-16BE中的文本文件(或简单地用UTF-16BE中的输入字符串),例如上面的那个?
答案 0 :(得分:2)
假设文本实际上是用UTF-16BE编码的(而不是,正如您在问题中所示,作为包含反斜杠和'u'
字符的ASCII字符串),您可以使用iconv
命令。
假设您的语言环境设置为处理UTF-8输出:
iconv -f utf-16be -t utf-8 [input-file]
编辑:
根据您的评论,您拥有的不是UTF-16BE;它显然是纯ASCII,使用\u....
语法编码Unicode代码点。这不是iconv
识别的格式(据我所知)。
您应该编辑您的问题,删除对UTF-16BE的任何引用,并更准确地解释您实际拥有的数据以及您想要使用它做什么。这些字符串来自哪里?它们是存储在文本文件中,还是来自其他来源(比如某些程序的输出)?输入是否完全 \u....
,还是与其他数据混合?您的语言环境设置是否配置为正确显示UTF-8?
如果您的字符串包含"\u0444\u0430\u0439\u043b"
(即24个ASCII字符),那么printf
命令应该有效 - 如果您使用的是{{{ 1}}。
printf
既是shell内置命令又是外部命令printf
,是GNU coreutils包的一部分。
以下适用于我的系统:
/usr/bin/printf
或者您可以使用$ s='\u0444\u0430\u0439\u043b'
$ printf "$s\n"
файл
格式(这是特定于%b
命令; C的printf
函数不执行此操作),它解释参数字符串中的反斜杠转义(通常它们只以格式字符串解释:
printf()
在另一个使用较旧版本bash的系统上,$ printf "%b\n" "$s"
файл
内置版无法识别printf
转义符,但\u
会转义。似乎coreutils /usr/bin/printf
命令比bash更早地获得了对printf
转义的支持。
\u
所有这些假设您在变量中都有$ s='\u0444\u0430\u0439\u043b'
$ printf "$s\n"
\u0444\u0430\u0439\u043b
$ printf "%b\n" "$s"
\u0444\u0430\u0439\u043b
$ /usr/bin/printf "$s\n"
файл
$ /usr/bin/printf "%b\n" "$s"
файл
字符串。如果它在一个文件中,你可以将文件内容篡改成一个shell变量,一次可能是一行,但它不是最好的解决方案。在这种情况下,这个Perl脚本应该完成这项工作;它将其输入复制到stdout,用相应的Unicode字符替换'\u0444\u0430\u0439\u043b'
序列,以UTF-8编码;输入可以是命令行中命名的一个或多个文件,也可以是标准输入,如果它没有参数调用。
\u....
再次,请编辑您的问题,以便它反映您的实际问题并删除对UTF-16BE的任何引用。
答案 1 :(得分:1)
简单地说:
echo -e "\u0444\u0430\u0439\u043b"
请注意,您可能需要将env变量LANG
设置为utf-8
:
export LANG="en_US.UTF-8"
正如Keith Thompson指出的那样,使用printf
可能更好;所以,你有:
printf "\u0444\u0430\u0439\u043b"
对于上述两个选项,输出为:
файл