我在数据库中有文本,存储为:\xE2\x82\xAC 50
重要提示:存储在数据库中的符号不是UTF字节,而是符号:“斜杠”,“字母x”,“字母E”等。所以Ruby表示将是"\\xE2\\x82\\xAC 50"
(双斜线,不单身。)
如何将此字符串转换为€ 50
:
> xx = "\\xE2\\x82\\xAC"
"\\xE2\\x82\\xAC"
> xx.bytes
[92, 120, 69, 50, 92, 120, 56, 50, 92, 120, 65, 67]
这不起作用:
xx.force_encoding('utf-8')
xx.encode('utf-8')
xx.force_encoding('binary').force_encoding('utf-8')
xx.encode('ASCII-8BIT').encode('utf-8')
答案 0 :(得分:1)
它不是"在Ruby"事情,它是关于理解你所看到的以及字符串和转义字符的工作方式。
默想:
"\\xE2\\x82\\xAC" # => "\\xE2\\x82\\xAC"
'\xE2\x82\xAC' # => "\\xE2\\x82\\xAC"
"\xE2\x82\xAC" # => "€"
第三种方法是如何定义创建欧元符号字符的字节。前两个是用字面反斜杠写字符串的两种不同方式。
如果您已将数据正确存储在数据库中,则可以正确检索数据。您正在使用的数据库驱动程序负责转换为该语言使用的字符串,因此一旦您检索到这些字段,它就应该是透明的。
当前的Rubies默认使用UTF-8,因此没有必要尝试将字符串强制为UTF-8,只需正确定义即可。
在学习特殊情况以及单引号字符串与双引号的行为方式不同之前,处理字符串中的字符转义会让人感到困惑。您可以通过阅读Wikipedia" Escape character"来找到有关逃避的更多信息。文章。这些信息几乎适用于所有语言,而不仅仅是Ruby。
答案 1 :(得分:1)
现在只有一个丑陋的"转换器"
def fix_utf_symbols(str)
match = str.scan /(\\x[0-9A-F]{2})/
match.flatten.each do |ascii_code|
utf_char = ascii_code[2..3].hex.chr
str.gsub! ascii_code, utf_char
end
str
end
欢迎更优雅的解决方案