泰语字符中的Nominatim反向地理编码地址显示不正确

时间:2013-09-26 06:51:54

标签: php mysql openstreetmap json nominatim

我在PHP中使用这些代码来执行反向地理编码[从纬度,经度获取地址]:

<?php

$lon = 100.753;
$lat = 13.69362;

$addr = getAddress($lat,$lon);

echo "Address: ".$addr;

function getAddress($RG_Lat,$RG_Lon)
{
  $json = "http://nominatim.openstreetmap.org/reverse?format=json&lat=".$RG_Lat."&lon=".$RG_Lon."&zoom=27&addressdetails=1";
  $jsonfile = file_get_contents($json);
  $RG_array = json_decode($jsonfile,true);

  foreach ($RG_array as $name => $value)
  {
      if($name == "display_name")
      {
          $RG_address = $value;
          break;
      }
  }

  return $RG_address;
}
?>

结果是这样的字符串:

Short term parking, ท่าอาà¸à¸²à¸¨à¸¢à¸²à¸™à¸ªà¸¸à¸§à¸£à¸£à¸“ภูมิ, สมุทรปราà¸à¸²à¸£, จังหวัดสมุทรปราà¸à¸²à¸£, ราชอาณาจัà¸à¸£à¹„ทย

我将此字符串保存到mysql数据库中,并使用字段类型存储,这是utf8_general_ci。

我的问题是如何在从数据库中取出后,在网上的泰语字符中正确显示此字符串?

仅供参考,Thai Character的实际地址是这样的:

Short term parking, ท่าอากาศยานสุวรรณภูมิ, Samut Prakan, Samut Prakan Province, Thailand

谢谢。

1 个答案:

答案 0 :(得分:1)

似乎你首先存储了错误的字符串,因为你没有正确解码它。如果您查看query result in your browser,可以看到结果包含unicode转义序列,如 \ u0e17 \ u0e48 \ u0e32 \ u0e2d 。必须首先解码这些序列。如果您将它们输入到http://rishida.net/tools/conversion/等网络转换器中,您将开始看到正确的字符。在在数据库中存储字符串之前,您必须执行类似的转换