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
答案 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