在 bash 中,如何将 Unicode 代码点 [0-9A-F] 转换为可打印字符?

在 bash 中,如何将 Unicode 代码点 [0-9A-F] 转换为可打印字符?

我有一个 Unicode 代码点列表,但我不知道将这些十六进制值转换为它们代表的实际字符的“简单”方法...

我听说过桀骜echo -e '\u0965',但我用巴什4.1.

对于 bash 有没有像 zsh 方法一样简单的东西?

答案1

您可以将 bash 的 echo 或 GNU coreutils 中的 /bin/echo 与 iconv 结合使用:

echo -ne '\x09\x65' | iconv -f utf-16be

默认情况下 iconv 转换为您的区域设置编码。也许 Perl 比依赖特定的 shell 或 echo 命令更可移植。我所知道的大多数 UNIX 系统都提供 Perl,甚至还有多个 Windows 移植版本。

perl -C -e 'print chr 0x0965'

大多数时候,当我需要这样做时,我会使用像 Vim/GVim 这样具有内置支持的编辑器。在插入模式下,按 Ctrl-V,然后按 u,然后键入四个十六进制字符。如果您想要 U+FFFF 之外的字符,请使用大写 U 并键入 8 个十六进制字符。 Vim 还支持自定义易于制作的键盘映射。它将一系列字符转换为另一个符号。例如,我开发了一个名为 www 的键盘映射,它将 TM 转换为 ™、(C) 转换为 ©、(R) 转换为 ® 等。我还有克林贡语的键盘映射,以供必要时使用。我确信 Emacs 也有类似的东西。如果您使用的是包含 GVim 和 GNOME 终端的 GTK+ 应用程序,您可以尝试 Control-Shift-u 后跟 4 个十六进制字符来创建 Unicode 字符。我确信 KDE/Qt 也有类似的东西。

更新:从 Bash 4.2 开始,它现在似乎是一个内置功能:

echo $'\u0965'

更新:另外,现在 Python 示例可能比 Perl 更受青睐。这在 Python 2 和 3 中都有效:

python -c 'print(u"\u0965")'

答案2

重击 4.2(2011 年发布)添加了对echo -e '\u0965'printf '\u0965'printf %b '\u0965'的支持echo $'\u0965'

http://tiswww.case.edu/php/chet/bash/FAQ:

o   $'...', echo, and printf understand \uXXXX and \UXXXXXXXX escape sequences.

答案3

如果您有 GNU coreutils,请尝试printf

$ printf '\u0965\n'

echo如果您的控制台使用 UTF-8 并且您有 UTF-8 编码,则可以完成此工作:

$ echo -e '\xE0\xA5\xA5'

您可以在此处找到 Unicode 到 UTF-8 十六进制编码的表:http://www.utf8-chartable.de/。您可以使用多种脚本语言将 Unicode 代码点转换为十六进制。这是一个使用 python 的示例:

python -c "print(unichr(int('0965', 16)).encode('utf-8').encode('hex'))"

下面是一个 Perl 脚本,它将参数转换为正确的十六进制值(这里有许多不必要的括号):

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Encode;

foreach (@ARGV) {
    say unpack('H*', encode('utf8', chr(hex($_))))
}

例如,

./uni2utf 0965
e0a5a5

当然,如果您有 Perl 或 Python,您也可以使用它们来打印字符。

答案4

在 bash 版本 4.2(及更高版本)中使用模式替换:

${parameter/pattern/string}

如此处所述http://steve-parker.org/sh/tips/pattern-substitution/

UNICODE_HEX="U+02211"
printf ${UNICODE_HEX/U+/"\U"}

UNICODE_HEX="U+03BB"
printf ${UNICODE_HEX/U+/"\U"}
λ         

相关内容