将PHP服务中的JSON编码的UTF-8数据读入Ruby应用程序

时间:2013-10-27 23:22:48

标签: php ruby json utf-8 sinatra

我的大脑疼,所以我需要帮助来解决这个问题。我已经阅读了许多类似的编码问题,但我找不到任何可以帮助我解决这个问题的信息。

我有一个从数据库中读取数据的PHP服务。它将字符集设置为:

mysql_set_charset('utf8', $con)

然后它基本上执行一个查询并通过这样的db项循环:

while($row = mysql_fetch_object($result)) {
  $row->MyField1 = utf8_encode($row->MyField1);
  $row->MyField2 = utf8_encode($row->MyField2);
  ...
  $res[] = $row;
}

并以:

结束
print json_encode($res);

然后我用以下内容从Ruby(一个sinatra应用程序)中读取数据:

uri = URI(str)
source = Net::HTTP.get(uri)
src = JSON.parse(source)
src.each do |s|
    # Display s.MyField1 in HTML here....  HTML page is HTML5 and <meta charset="utf-8">
end

问题是我显示的字符串如下:

ALLMÃNHETENS ÃKNING

'Ã'对我来说是一个未知的角色。它应该在第一次出现时'Ä''Å'(瑞典语A中有'变音符号'http://en.wikipedia.org/wiki/Ring_(diacritic))。

PHP代码是错误的吗?还是Ruby代码?如果有人能指出我正确的方向,我将非常感激?坦率地说,我不知道从哪里开始追逐虫子。

1 个答案:

答案 0 :(得分:0)

好的似乎答案在这里非常准确地描述了:

http://www.i18nqa.com/debug/bug-utf-8-latin1.html

重要的是我的PHP脚本必须添加:

Content-type: application/json; charset=utf-8

否则UTF-8将其各自的字节解释为ISO-8859-1或Windows-1252,完全导致上述bevahiour。

重要补充:我还必须删除PHP脚本中的utf8_encode()调用,因为数据已经是UTF-8编码(或者mysql_set_charset(“utf8”,$ con)做了那件事,我不知道知道)。