假设文本实际上是用 UTF-16BE 编码的(而不是像您在问题中显示的那样,作为包含反斜杠和 'u' 字符的 ASCII 字符串),您可以使用 iconv 命令。
假设您的语言环境设置为处理 UTF-8 输出:
iconv -f utf-16be -t utf-8 [input-file]
编辑:
根据您的 cmets,您所拥有的根本不是 UTF-16BE;它显然是纯 ASCII,使用 \u.... 语法对 Unicode 代码点进行编码。这不是iconv 识别的格式(据我所知)。
您应该编辑您的问题,删除对 UTF-16BE 的所有引用,并更准确地解释您实际拥有哪些数据,以及您想用它做什么。这些字符串是从哪里来的?它们是存储在文本文件中,还是来自其他来源(例如,某个程序的输出)?输入是否完全由\u.... 组成,还是与其他数据混合在一起?您的区域设置是否配置为正确显示 UTF-8?
如果您有一个包含"\u0444\u0430\u0439\u043b"(即24 个ASCII 字符)的字符串,那么printf 命令应该可以工作——如果您使用的是足够新的printf 版本。 p>
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 可以。看来 coreutils printf 命令比 bash 更早地获得了对 \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"
файл
所有这些都假设您在变量中有'\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 的任何引用。