我有一个 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"}
λ