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

Pet*_*r.O 23 bash unicode

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

我听说zshecho -e '\u0965',但我使用bash 4.1。

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

pen*_*359 19

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

echo -ne '\x09\x65' | iconv -f utf-16be
Run Code Online (Sandbox Code Playgroud)

默认情况下 iconv 转换为您的语言环境编码。也许比依赖特定的 shell 或 echo 命令更便携的是 Perl。我所知道的大多数 UNIX 系统都有 Perl 可用,甚至有几个 Windows 端口。

perl -C -e 'print chr 0x0965'
Run Code Online (Sandbox Code Playgroud)

大多数时候,当我需要这样做时,我会使用像 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'
Run Code Online (Sandbox Code Playgroud)

更新:此外,现在 Python 示例可能比 Perl 更受欢迎。这适用于 Python 2 和 3:

python -c 'print(u"\u0965")'
Run Code Online (Sandbox Code Playgroud)


Lri*_*Lri 13

巴什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.
Run Code Online (Sandbox Code Playgroud)

  • +1;请注意,“bash 4.2.x”版本有一个错误,即“0x80”和“0xff”(“128 - 255”)之间的值(即在扩展的 ASCII 范围内)没有正确进行 UTF8 编码,而是直接传递,导致无效的 UTF8 字符,某些终端将其呈现为“?”。从(至少)“4.3.11”开始,此问题已得到修复;如果 `echo $'\ued'` 渲染为 `í`,则该错误_不_存在。 (2认同)

Ste*_*n D 5

如果您有 GNU coreutils,请尝试printf

$ printf '\u0965\n'
?
Run Code Online (Sandbox Code Playgroud)

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

$ echo -e '\xE0\xA5\xA5'
Run Code Online (Sandbox Code Playgroud)

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

python -c "print(unichr(int('0965', 16)).encode('utf-8').encode('hex'))"
Run Code Online (Sandbox Code Playgroud)

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

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

foreach (@ARGV) {
    say unpack('H*', encode('utf8', chr(hex($_))))
}
Run Code Online (Sandbox Code Playgroud)

例如,

./uni2utf 0965
e0a5a5
Run Code Online (Sandbox Code Playgroud)

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