使用像hexdump或xxd这样的shell工具打印十六进制Unicode代码点。

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

这在bash 4.2和zsh 4.3.11中可以使用内置的printf实现,但不能在bash 3.2或OS X的/ usr / bin / printf中使用。 -n1逐个读取一个字符,-d''将分隔符从 \n 更改为\0,因此read也包括换行符(但不包括NUL字符)。 POSIX指定read的唯一选项是-r

3

一个简单的Python 2.7脚本可以完成这项工作(假设您的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接