我正在开发一个Rails应用程序。
我正在使用返回中国一些省份的API。 API以十六进制字符串形式返回省份,例如:
{ "\xE5\x8C\x97\xE4\xBA\xAC" => "some data" }
我的JavaScript调用一个返回此哈希的控制器。我将所有省字符串放入下拉列表中,但字符串显示为黑色菱形,中间带有问号。我想知道如何将Ruby十六进制字符串转换为实际的中文字符,北京?或者,如果可能的话,我可以将JavaScript中的十六进制字符串转换为中文字符吗?
答案 0 :(得分: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,但某个地方您的应用程序正在忘记该字符串应该是什么编码。如果您force the encoding为UTF-8,则问题就会消失:
> s.force_encoding('utf-8')
=> "北京"
您应该在应用程序的最边缘修复此编码问题,从而从此远程API读取数据。一旦完成,在你关心的任何地方,一切都应该是合理的UTF-8。这应该可以解决您的JavaScript问题以及JavaScript非常乐意使用UTF-8。
答案 1 :(得分:0)
我认为你可以这样做:doc RB:
2.1.2 :002 > require 'uri'
=> true
2.1.2 :003 > URI.decode("\xE5\x8C\x97\xE4\xBA\xAC")
=> "北京"
js:decodeURIComponent(URIstring)