2016-10-25 10 views
0

Googleマップマーカーに問題があります。私はマーカーの名前に磨かれた文字を使いたい。私は私のdbにあるように。これは適切な(afaik)XMLを作成するために使用するファイルです。xmlマーカーのエンコーディングが間違っています

function parseToXML($htmlStr) 
{ 
$xmlStr=str_replace('<','&lt;',$htmlStr); 
$xmlStr=str_replace('>','&gt;',$xmlStr); 
$xmlStr=str_replace('"','&quot;',$xmlStr); 
$xmlStr=str_replace("'",'&#39;',$xmlStr); 
$xmlStr=str_replace("&",'&amp;',$xmlStr); 
return $xmlStr; 
} 

// Opens a connection to a MySQL server 
$connection=mysql_connect ('localhost', $username, $password); 
if (!$connection) { 
    die('Not connected : ' . mysql_error()); 
} 

// Set the active MySQL database 
$db_selected = mysql_select_db($database, $connection); 
if (!$db_selected) { 
    die ('Can\'t use db : ' . mysql_error()); 
} 

// Select all the rows in the markers table 
$query = "SELECT * FROM markers WHERE 1"; 
$result = mysql_query($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

header("Content-type: text/xml"); 

// Start XML file, echo parent node 
echo '<markers>'; 

// Iterate through the rows, printing XML nodes for each 
while ($row = @mysql_fetch_assoc($result)){ 
    // ADD TO XML DOCUMENT NODE 
    echo '<marker '; 
    $test = $row['name']; 
    //$test2 = string utf8_encode (string $test); 
    echo 'name="' . $test . '" '; 
    echo 'address="' . parseToXML($row['address']) . '" '; 
    echo 'lat="' . $row['lat'] . '" '; 
    echo 'lng="' . $row['lng'] . '" '; 
    echo 'city="' . $row['city'] . '" '; 
    echo '/>'; 
} 

// End XML file 
echo '</markers>'; 

私は(ブラウザ表示ポリッシュ文字が適切に)このファイルを使用して、私のDBから適切な出力を得るが、私は使用してマップを作成するとき:

<!DOCTYPE html > 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
    <title>PHP/MySQL & Google Maps Example</title> 
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBdj-LlQrTCj6bQcAq4fxONy9MaZcXvfc8" 
      type="text/javascript"></script> 
    <link rel="stylesheet" type="text/css" href="style.css"> 
    <script type="text/javascript"> 
    //<![CDATA[ 

    var customIcons = { 
     restaurant: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png' 
     }, 
     bar: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png' 
     } 
    }; 

    function load() { 
     var map = new google.maps.Map(document.getElementById("map"), { 
     center: new google.maps.LatLng(50.046465, 19.913828), 
     zoom: 13, 
     mapTypeId: 'roadmap' 
     }); 
     var infoWindow = new google.maps.InfoWindow; 

     // Change this depending on the name of your PHP file 
     downloadUrl("markergen.php", function(data) { 
     var xml = data.responseXML; 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     for (var i = 0; i < markers.length; i++) { 
      var name = markers[i].getAttribute("name"); 
      var address = markers[i].getAttribute("address"); 
      var type = markers[i].getAttribute("city"); 
      var point = new google.maps.LatLng(
       parseFloat(markers[i].getAttribute("lat")), 
       parseFloat(markers[i].getAttribute("lng"))); 
      var html = "<b>" + name + "</b> <br/>" + address; 
      var icon = customIcons[type] || {}; 
      var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon 
      }); 
      bindInfoWindow(marker, map, infoWindow, html); 
     } 
     }); 
    } 

    function bindInfoWindow(marker, map, infoWindow, html) { 
     google.maps.event.addListener(marker, 'click', function() { 
     infoWindow.setContent(html); 
     infoWindow.open(map, marker); 
     }); 
    } 

    function downloadUrl(url, callback) { 
     var request = window.ActiveXObject ? 
      new ActiveXObject('Microsoft.XMLHTTP') : 
      new XMLHttpRequest; 

     request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      request.onreadystatechange = doNothing; 
      callback(request, request.status); 
     } 
     }; 

     request.open('GET', url, true); 
     request.send(null); 
    } 

    function doNothing() {} 

    //]]> 

    </script> 

    </head> 

    <body onload="load()"> 
    <div id="map"></div> 
    </body> 

</html> 

を、私は全体のデータを得るが、正しくずに磨きを表示文字。 は、私は私がおそらく

string utf8_encode (string $data) 

を使用する必要があることを知っているが、私は、データを変換して失敗する最初のファイルに入れしようとしました。 私の質問には、それを私のコードに正確に載せるべき場所です。またはこれを行うための他の/より良い選択肢がありますか?

EDIT: 私は今、DOMを使用しようとしているが、このようなオブジェクト:

<?php 
require("../test1/phpsqlinfo_dbinfo.php"); 


// Start XML file, create parent node 

$dom = new DOMDocument("1.0"); 
$node = $dom->createElement("markers"); 
$parnode = $dom->appendChild($node); 

// Opens a connection to a MySQL server 

$mysqli = new mysqli("localhost", $username, $password, $database); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->set_charset("utf8")) { 
    printf("Error loading character set utf8: %s\n", $mysqli->error); 
    exit(); 
} else { 
    printf("Current character set: %s\n", $mysqli->character_set_name()); 
} 


// Select all the rows in the markers table 

$query = "SELECT * FROM markers WHERE 1"; 
$result = $mysqli->query($query); 


header("Content-type: text/xml"); 

// Iterate through the rows, adding XML nodes for each 

while ($row = @mysqli_fetch_assoc($result)){ 
    // ADD TO XML DOCUMENT NODE 
    $node = $dom->createElement("marker"); 
    $newnode = $parnode->appendChild($node); 
    $newnode->setAttribute("name",$row['name']); 
    $newnode->setAttribute("address", $row['address']); 
    $newnode->setAttribute("lat", $row['lat']); 
    $newnode->setAttribute("lng", $row['lng']); 
    $newnode->setAttribute("city", $row['city']); 
} 

echo $dom->saveXML(); 

?> 

しかし、今私のような結果にマーカーの内側にマーカーを持っている:データOFCと​​。それを修正するには?まだ私はデータが正しくエンコードされているが、そうでなければならないと確信していません。

+0

MySQLに使用するエンコーディングを決して伝えません。あなたのデータはすでにUTF-8ですか?それとも、テーブルを作成したときにデータベースのデフォルトのエンコーディングが有効であったとしてもかまいません。 –

答えて

1

いいえ、utf8_encode()は使用しないでください。

ただし、ext/mysqliまたはext/pdo(古い、depreactedで削除されたext/mysqlは使用しないでください)。すべての文字列をデータベースからUTF-8として取得するには、接続エンコーディングをUTF-8に設定します。

次に、XMLライブラリ(DOMまたはXMLWriter)を使用してXML出力を生成します。ライブラリは必要に応じて特殊文字をエンコード/エスケープします。

XML宣言も欠落しています。

+0

返信ありがとうございます。私はこのような何かを試した: –

関連する問題