如何将中文十六进制字符串解码为中文字符或JavaScript?

5

我正在开发一款Rails应用。

我使用了一个API来获取中国的一些省份信息。该API返回的省份信息以十六进制字符串形式呈现,例如:

{ "\xE5\x8C\x97\xE4\xBA\xAC" => "some data" }

我的 JavaScript 调用了一个控制器,返回了这个哈希值。我将所有的省份字符串放入下拉菜单中,但字符串显示为一个黑色菱形,中间有问号。我想知道如何将 Ruby 的十六进制字符串转换为实际的中文字符,例如 北京?或者如果可能的话,我是否可以在 JavaScript 中将十六进制字符串转换为中文字符?
2个回答

4

字节 \xE5\x8C\x97 是汉字 的 UTF-8 表示,\xE4\xBA\xAC 是汉字 的 UTF-8 表示。因此,这个字符串:

"\xE5\x8C\x97\xE4\xBA\xAC"

如果将字节解释为UTF-8,则北京是正确的中文。看到十六进制码而不是中文字符,说明该字符串的编码是二进制:

> s = "\xE5\x8C\x97\xE4\xBA\xAC"
 => "北京" 
> s.encoding
 => #<Encoding:UTF-8> 
> s.force_encoding('binary')
 => "\xE5\x8C\x97\xE4\xBA\xAC"

所以你正在使用的API使用的是UTF-8编码,但是你的应用程序在某个地方丢失了该字符串应该是什么编码的信息。如果你强制将编码设置为UTF-8,问题就会消失:

> s.force_encoding('utf-8')
 => "北京" 

你应该在应用程序的最外层修复这个编码问题,从远程API读取数据时。一旦完成,你所关心的所有地方都应该是明智的UTF-8。这应该解决你的JavaScript问题,因为JavaScript很高兴使用UTF-8工作。

谢谢!这正是问题所在。 - gruuuvy

0
我认为你可以这样做:docrb:
 2.1.2 :002 > require 'uri'
     => true 
    2.1.2 :003 > URI.decode("\xE5\x8C\x97\xE4\xBA\xAC")
     => "北京" 

JS: decodeURIComponent(URIstring)


这在IRB中似乎可以工作,但是当我通过Rails控制器将此数据作为JSON返回时,字符串会变成黑色钻石字符(当我console.log JavaScript字符串时)。因此,当我使用decodeURIComponent时,它没有任何效果。 - gruuuvy
在JS中,decodeURIComponent("\xE5\x8C\x97\xE4\xBA\xAC")返回"å京"。 - gruuuvy
你可能想在irb中评估"\xE5\x8C\x97\xE4\xBA\xAC",而不必担心URI.decode的问题... - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接