假设我有一个0xb7字节编码为UTF代码点的JSON:
{"key":"_\u00b7_"}
如果我用jq提取"key“的值,它将保持这个字节的utf8编码,即"c2 b7":
$ echo '{"key":"_\u00b7_"}' | ./jq '.key' -r | xxd
0000000: 5fc2 b75f 0a _.._.
有jq命令从这个JSON?中提取解码的"5f b7 5f“字节序列吗?
我可以通过一些额外的工具来解决这个问题,比如iconv,但是它有点难看:
$ echo '{"key":"_\u00b7_"}' | ./jq '.key' -r \
| iconv -f utf8 -t utf32le \
| xxd -ps | sed -e 's/000000//g' | xxd -ps -r \
| xxd
0000000: 5fb7 5f0a _._.
发布于 2018-01-13 17:46:42
def hx:
def hex: [if . < 10 then 48 + . else 55 + . end] | implode ;
tonumber | "\(./16 | floor | hex)\(. % 16 | hex)";
{"key":"_\u00b7_"} | .key | explode | map(hx)
生产:
["5F","B7","5F"]
“原始拜特斯”(注意事项)
因为jq只支持UTF-8字符串,所以您必须使用一些外部工具来获得“原始字节”。也许这更接近你想要的:
jq -nrj '{"key":"_\u00b7_"} | .key' | iconv -f utf-8 -t ISO8859-1
这就产生了三个字节。
这里有一个无图标的解决方案:
jq -nrj '{"key":"_\u00b7_"} | .key' | php -r 'print utf8_decode(readline());'
发布于 2018-01-14 14:10:02
交替
在jq
之外寻址字符编码场景
虽然您不想要额外的工具,但iconv
和hexdump
确实很容易获得--例如,当我需要完全了解管道的某些部分时,我经常依赖于iconv
,而当我想控制这些部分的表示形式的格式时,使用hexdump
。
因此,另一种选择是:
jq -njr '{"key":"_\u00b7_"} | .key' | iconv -f utf8 -t UTF-32LE | hexdump -ve '1/1 "%.X"'
结果:
5FB75F
https://stackoverflow.com/questions/48240055
复制相似问题