我尝试在Base64上编码和解码西里尔文本:
cyrillic_text = "Какой-то русский текст"
base64 = Base64.encode64 cyrillic_text
inverse = Base64.decode64 base64
结果是:
"\xD0\x9A\xD0\xB0\xD0\xBA\xD0\xBE\xD0\xB9-\xD1\x82\xD0\xBE \xD1\x80\xD1\x83\xD1\x81\xD1\x81\xD0\xBA\xD0\xB8\xD0\xB9 \xD1\x82\xD0\xB5\xD0\xBA\xD1\x81\xD1\x82"
为什么呢?如何将编码文本转换回初始状态?
inverse.encode "UTF-8"
Encoding::UndefinedConversionError: "\xD0" from ASCII-8BIT to UTF-8
from (irb):93:in `encode'
from (irb):93
from /home/alexk/rubystack-2.2.7-2/ruby/bin/irb:11:in `<main>'
答案 0 :(得分:3)
cyrillic_text = "Какой-то русский текст"
base64 = Base64.encode64 cyrillic_text
inverse = Base64.decode64(base64).force_encoding(Encoding::UTF_8)
#⇒ "Какой-то русский текст"
在Base64解码过程之后,它只是一个字节序列,Ruby不知道如何解释它。应该明确指示Ruby使用UTF8
编码,因为它最初是UTF8编码的字符串。
String#encode
的原始尝试无效,因为它确实已经是UTF-8编码的字符串,再次调用encode
将其搞砸。唯一的需要是告诉Ruby它是UTF8。