有人可以帮助我将一些(潜在的)伪造的UTF-8多字节字符转换成ascii,如下所示吗?
\u6162
→["\x61", "\x62"]
→["a", "b"]
→"ab"
我的用例很有趣。我知道我没有通过在多字节字符中表示两个ascii字符来压缩任何东西。
我玩过各种版本的unpack
,但它似乎无法正常工作:
"\u6162".unpack('H*')
# => ["e685a2"]
强制编码似乎返回相同的内容:
"\u6162".force_encoding('US-ASCII')
# => "\xE6\x85\xA2"
答案 0 :(得分:2)
"\u6162"
不等同于"\x61" + "\x62"
。 \u
表示不直接转换为十六进制值的Unicode代码点。 Unicode code point 6162 is 慢
因为它是一个字符串,并且因为Ruby默认使用UTF-8,所以当你解压缩它时,你会得到U + 6162的UTF-8值,它是三个字节:E6 85 A2
。
2.2.1 :023 > "\u6162".encoding
=> #<Encoding:UTF-8>
2.2.1 :024 > "\u6162".unpack("A*")
=> ["\xE6\x85\xA2"]
要获得所需内容,您需要其UTF-16表示61 62
。但是,如果您只是编码为UTF-16
,则会得到一个字节顺序标记FE FF 61 62
。所以使用UTF-16BE(大端)来避免这种情况。
2.2.1 :052 > "\u6162".encode("UTF-16BE").unpack("A*")
=> ["ab"]
答案 1 :(得分:1)
"\u6162".codepoints.first.divmod(16 ** 2).map(&:chr).join
# => "ab"