Ruby UTF-8红宝石编码

Ruby UTF-8红宝石编码,ruby,encoding,utf-8,Ruby,Encoding,Utf 8,我有一个字符串:WinterIDäSchwiiz,它来自一个API,我想在数据库中搜索它。现在发现这个字符串的编码方式与它在数据库中的保存方式不同。然而ruby说两者的编码都是utf-8。发生了什么事 我已经找到了解决这个问题的最糟糕的方法,方法是转到bytesequence,用不同的bytesequence替换代表“ä”的字节,然后强制将其编码为utf8。它起作用了,但伤了我的眼睛。是否有人有比以下更好的解决方案: "WinterIDäSchwiiz".bytes.join(",").gsu

我有一个字符串:WinterIDäSchwiiz,它来自一个API,我想在数据库中搜索它。现在发现这个字符串的编码方式与它在数据库中的保存方式不同。然而ruby说两者的编码都是utf-8。发生了什么事

我已经找到了解决这个问题的最糟糕的方法,方法是转到bytesequence,用不同的bytesequence替换代表“ä”的字节,然后强制将其编码为utf8。它起作用了,但伤了我的眼睛。是否有人有比以下更好的解决方案:

 "WinterIDäSchwiiz".bytes.join(",").gsub("97,204,136","195,164").split(",").collect{|s| s.to_i}.pack('C*').force_encoding('utf-8')
您的字符串是UTF-8

我可以说,因为您的修复方法是用字节(195164)替换字节(97204136)

要替换的第一个字节97(
0x61
)是UTF-8字符
a
。第二个两个字节204和136(
0xCC 0x88
)是UTF-8字符U+0308的字节:
̉
。这两个字符组合成

您期望的字节是195和164(
0xC3 0xA4
),它们加在一起是U+00E4或

两者都是UTF-8。一个打印
,另一个打印
ä
。这是一个例子

换言之:

str1 = "a\xCC\x88"
puts str1 # => ä
p str1.bytes # => [97, 204, 136]
p str1.encoding # => #<Encoding:UTF-8>

str2 = "\xC3\xA4"
puts str2 # => ä
p str2.bytes # => [195, 164]
p str2.encoding # => #<Encoding:UTF-8>
如果您没有Ruby 2.2+,那么。。。升级但是如果由于某种原因无法升级,您可以使用,如果您使用的是Rails或

还有一件事 您不需要这样做,因为上面是在Ruby中进行Unicode规范化的正确方法,但这是一种更简单的方法:

"WinterIDäSchwiiz".bytes.join(",").gsub("97,204,136","195,164").split(",").collect{|s| s.to_i }.pack('C*').force_encoding('utf-8')
…应该是这样的:

"WinterIDäSchwiiz".gsub("a\xCC\x88", "\xC3\xA4")

每当你在Ruby中看到类似于
join(“,”)…split(“,”)
的东西时,几乎肯定是错误的解决方案。

你的问题中没有足够的信息。如果不是UTF-8,字符串的正确编码是什么?API的HTTP头报告了什么编码?在数据库表上设置了什么编码?什么代码负责从API检索数据?什么代码将其插入数据库?什么代码从数据库中检索它?这是一个很好的答案!非常感谢,我学到了很多!
"WinterIDäSchwiiz".gsub("a\xCC\x88", "\xC3\xA4")