【问题标题】:Printing hexadecimal Unicode code points with shell utilities like hexdump or xxd使用 hexdump 或 xxd 等 shell 实用程序打印十六进制 Unicode 代码点
【发布时间】:2013-03-14 12:42:16
【问题描述】:

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

【问题讨论】:

    标签: bash unicode


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一个简单的 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
      

      【讨论】:

        猜你喜欢
        • 2016-02-13
        • 2019-01-27
        • 2013-03-31
        • 2011-06-10
        • 1970-01-01
        • 2013-03-11
        • 2020-05-27
        • 1970-01-01
        • 2015-12-06
        相关资源
        最近更新 更多