2016-10-25 3 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>'; 

Я получаю надлежащий вывод из моей БД с помощью этого файл (отображения браузера полировать символы должным образом), но когда я создать карту с помощью:

<!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(); 

?> 

Но теперь у меня есть маркер внутри маркера в результатах, как: <marker><marker>...</marker></marker> с ОФК данных. Как это исправить? Тем не менее я не уверен, что данные правильно закодированы, но должны быть.

+0

Вы никогда не говорите MySQL, какую кодировку использовать. Ваши данные уже UTF-8? Или это просто использование какой-либо кодировки базы данных по умолчанию, когда вы создали таблицы? –

ответ

1

Нет, вы не должны использовать utf8_encode().

Вы должны, однако, использовать ext/mysqli или ext/pdo (а не старый, defreacted и удаленный ext/mysql). Установите кодировку соединения в UTF-8, чтобы получить все строки в виде UTF-8 из базы данных.

Затем используйте XML-библиотеку (DOM или XMLWriter) для генерации вывода XML. Библиотеки будут кодировать/запускать специальные символы по мере необходимости.

Он также предоставит пропущенную декларацию XML.

+0

Ну большое спасибо за ответ. Я попробовал что-то вроде этого: –

Смежные вопросы