将西里尔文本转换为Base64并返回

时间:2018-04-12 11:48:56

标签: ruby base64 cyrillic

我尝试在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>'

1 个答案:

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