0

我经常遇到一个表示 UTF-16BE 的字符串,例如\u0444\u0430\u0439\u043b,它会被正确地呈现为файл.

我想知道:是否有一种简单的方法可以使用 sed 或其他命令行工具以 UTF-16BE(或只是 UTF-16BE 中的输入字符串)“呈现”文本文件,例如上面的那个?

另请参阅此相关问题

4

2 回答 2

3

假设文本实际上是用 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 的任何引用。

于 2012-12-29T04:42:28.387 回答
1

只需这样做:

echo -e "\u0444\u0430\u0439\u043b"

请注意,您可能需要将 env 变量设置LANGutf-8

export LANG="en_US.UTF-8"

printf正如 Keith Thompson 所指出的,使用;可能会更好。所以,你有:

printf "\u0444\u0430\u0439\u043b"

对于上述两个选项,输出为:

файл
于 2012-12-29T04:25:02.217 回答