4

Bash 4.2 和 zsh 支持echo $'\u30a2',但是有没有使用通用 shell 实用程序的替代方法?

$ ruby -e 'puts ARGV[0].chars.map{|c|c.ord.to_s(16)}.join(" ")' aäア
61 e4 30a2 1d400

这不适用于 U+10000 或其上方的字符:

$ printf %s aäア | iconv -f $(locale charmap) -t UTF-16BE | xxd -p
006100e430a2d835dc00
4

2 回答 2

4

我在https://raw.github.com/lhunath/scripts/master/bash/bashlib/bashlib找到了这个函数:

hex() { 
  printf '%x' "'$1"
}

更多示例:

$ printf %x\\n \'ア
7fc2
$ LC_CTYPE=C printf %x\\n \'ア
e3
$ printf %s $'  \n\n\\'|while IFS= read -r -d '' -n1 c;do printf %x\\n "'$c";done
20
20
a
a
5c
$ printf %s aäア|while IFS= read -r -d '' -n1 c;do printf '%s %x\n' "$c" "'$c";done
a 61
ä e4
ア 30a2
 1d400

printf适用于 bash 4.2 和 zsh 4.3.11 中的内置函数,但不适printf用于 bash 3.2 中的内置函数或 OS X 的/usr/bin/printf.

-n1一次读取一个字符,并将-d ''分隔符从 更改\n\0,因此read还包括换行符(但不包括 NUL 字符)。readPOSIX 指定的唯一选项是-r.

于 2013-09-02T08:48:16.040 回答
3

一个简单的 Python 2.7 脚本就可以完成这项工作(称之为 a.py)[下面的脚本假定您的 shell 编码默认为 UTF8 - 如果需要,您可能必须更改它]:

import sys

for i in unicode(sys.argv[1], 'utf-8'):
    print i.encode("utf_16_be").encode("hex")

测试:

$ python a.py aäア
0061
00e4
30a2
d835dc00
于 2013-08-02T14:54:07.553 回答