使用hexdump或xxd等shell实用程序打印十六进制Unicode代码点

时间:2013-03-14 12:42:17

标签: bash unicode

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

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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