将UTF-8多字节字符转换为多个ascii字符

时间:2016-01-31 02:27:00

标签: ruby utf-8 ascii

有人可以帮助我将一些(潜在的)伪造的UTF-8多字节字符转换成ascii,如下所示吗?

\u6162["\x61", "\x62"]["a", "b"]"ab"

我的用例很有趣。我知道我没有通过在多字节字符中表示两个ascii字符来压缩任何东西。

我玩过各种版本的unpack,但它似乎无法正常工作:

"\u6162".unpack('H*')
# => ["e685a2"]

强制编码似乎返回相同的内容:

"\u6162".force_encoding('US-ASCII')
# => "\xE6\x85\xA2"

2 个答案:

答案 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"