如何将反斜杠特殊符号解码为UTF-8

时间:2016-08-25 20:10:24

标签: ruby encoding utf-8

我在数据库中有文本,存储为:\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')

2 个答案:

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

欢迎更优雅的解决方案