JQ爆炸函数返回错误字符



我正在尝试解码base64编码的二进制内容在JQ使用函数。

当我运行爆炸,然后通过内爆,我希望它返回相同的字符串。但事实并非如此。试试这里:https://jqplay.org/s/Rt8H1qv8VRP

Base64 encoded string: "AQEAAAABAQAyGWRkZBXNWwcAAAAAAQIDBAUGBwgJClIGnj9SBp4/"
JQ: '@base64d | explode | implode | @base64'
Output: "AQEAAAABAQAyGWRkZBXvv71bBwAAAAABAgMEBQYHCAkKUgbvv70/Ugbvv70/"

进一步调试,

@base64d | explode | .[14]

返回
65533

在Ubuntu上运行下面的代码,你可以看到[14]字符是315(八进制)== 215(十进制)

$ echo "AQEAAAABAQAyGWRkZBXNWwcAAAAAAQIDBAUGBwgJClIGnj9SBp4/" | base64 -d | od -bc
0000000 001 001 000 000 000 001 001 000 062 031 144 144 144 025 315 133
001 001       001 001     2 031   d   d   d 025 315   [
0000020 007 000 000 000 000 001 002 003 004 005 006 007 010 011 012 122
a         001 002 003 004 005 006  a  b  t  n   R
0000040 006 236 077 122 006 236 077
006 236   ?   R 006 236   ?
0000047

为什么JQ返回这个奇怪的65533 (0xFFFD)字符?我错过了什么?

首先,这个问题与explodeimplode无关。仅使用@base64d | @base64产生相同的结果。

jq期望用base64编码的字符串是用UTF-8编码的文本。

如果解码的字符串不是UTF-8,则结果是未定义的。

您的输入不是UTF-8。

U+FFFD替换字符是用来标记输入错误的字符。