我经常遇到一个表示UTF-16BE的字符串,比如\u0444\u0430\u0439\u043b
, 将正确呈现为 файл
.
我想知道:是否有一种简单的方法可以通过使用 sed 或其他命令行工具以 UTF-16BE(或只是 UTF-16BE 中的输入字符串)“呈现”文本文件,例如上面的那个?
另见 this related question .
最佳答案
假设文本实际上是用 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
做。看来 coreutils printf
命令获得了对 \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;
}
再次,请编辑您的问题,使其反射(reflect)您的实际问题并删除对 UTF-16BE 的任何引用。
关于ubuntu - 如何在命令行中呈现 UTF-16BE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078659/