我经常遇到一个表示 UTF-16BE 的字符串,例如\u0444\u0430\u0439\u043b
,它会被正确地呈现为файл
.
我想知道:是否有一种简单的方法可以使用 sed 或其他命令行工具以 UTF-16BE(或只是 UTF-16BE 中的输入字符串)“呈现”文本文件,例如上面的那个?
另请参阅此相关问题。
我经常遇到一个表示 UTF-16BE 的字符串,例如\u0444\u0430\u0439\u043b
,它会被正确地呈现为файл
.
我想知道:是否有一种简单的方法可以使用 sed 或其他命令行工具以 UTF-16BE(或只是 UTF-16BE 中的输入字符串)“呈现”文本文件,例如上面的那个?
另请参阅此相关问题。
假设文本实际上是用 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
命令应该可以工作——如果您使用的是足够新的printf
.
printf
既是 shell 内置命令又是外部命令,/usr/bin/printf
是 GNU coreutils 包的一部分。
以下适用于我的系统:
$ s='\u0444\u0430\u0439\u043b'
$ printf "$s\n"
файл
或者您可以使用%b
格式(这是特定于printf
命令的;C 的printf()
函数不这样做),它解释参数字符串中的反斜杠转义(通常它们只在格式字符串中解释):
$ printf "%b\n" "$s"
файл
在另一个系统上,使用旧版本的 bash,printf
内置函数无法识别\u
转义 - 但/usr/bin/printf
可以。看来 coreutilsprintf
命令\u
比 bash 更早地获得了对转义的支持。
$ 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"
файл
所有这些都假设您'\u0444\u0430\u0439\u043b'
在变量中有字符串。如果它在一个文件中,您可以将文件内容放入一个 shell 变量中,一次可能是一行,但这不是最好的解决方案。在这种情况下,这个 Perl 脚本应该可以完成这项工作;它将其输入复制到标准输出,用\u....
相应的 Unicode 字符替换序列,以 UTF-8 编码;输入可以是在命令行中命名的一个或多个文件,也可以是标准输入(如果调用时不带参数)。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
binmode(STDOUT, ":utf8");
while (<>) {
s/\\u([\da-fA-F]{4})/chr(hex($1))/eg;
print;
}
再次,请编辑您的问题,使其反映您的实际问题并删除对 UTF-16BE 的任何引用。
只需这样做:
echo -e "\u0444\u0430\u0439\u043b"
请注意,您可能需要将 env 变量设置LANG
为utf-8
:
export LANG="en_US.UTF-8"
printf
正如 Keith Thompson 所指出的,使用;可能会更好。所以,你有:
printf "\u0444\u0430\u0439\u043b"
对于上述两个选项,输出为:
файл