Клуб API Карт

Проблема с кодировкой!

Пост в архиве.

Столкнулся со следующей проблемой. На сайте есть карта, метки на нее наносядся по средствам YMapsML, xml файл формируется php скриптом по данным из mysql, но если в базе есть поля содержащие русский текст (а он в большинстве и должен быть русский), то получаю вот такое сообщение об ошибке:

"Ошибка: :32: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xC8 0xE2 0xE0 0xED"

MySQL-кодировка utf8, сопоставление utf8 general ci, php файл что создает xml тоже в кодировке utf8, страница на которой отображается карта была в 1251, но и смена на utf8 не избавила от ошибки.

Подскажите, как решить данную проблему?

9 комментариев

а можно ссылку на страницу, либо на yml файл?

Все пока крутится на локалке на денвере.

Если это поможет фот код файла который генерирует ml:

header("Content-type: text/xml; charset='utf-8'");
include("bd.php");
echo 'http://maps.yandex.ru/ymaps/1.x" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd">
    http://maps.yandex.ru/representation/1.x">
       
 
       
           
       
   
 
   
        Объекты на карте
       
        ';
 
$query1= "SELECT * FROM users WHERE activation='1'";
$result1 = mysql_query($query1);
while ($par1 = mysql_fetch_array($result1))
{   

echo '';
echo '', $par1['login'], '';
echo '';
echo '';
echo '', $par1['name'], '';
echo '', $par1['phone'], '';
echo '', $par1['avatar'], '';
echo '', $par1['adres'], '';
echo '';
echo '';
echo '';
echo '', $par1['lat_map'], ' ', $par1['lng_map'], '';
echo '';
echo '';
 
echo "\n";
 
}
 
echo '
   
';

Подключение карты идет из js файла, но тут все тоже стандартно:

 var map;
 var ml;
 var gCollection;
        YMaps.jQuery(function () {
        map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
        map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10, YMaps.MapType.MAP);
        map.enableScrollZoom();
        map.addControl(new YMaps.SearchControl(), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Point(10, 128)));
            gCollection = new YMaps.GeoObjectCollection();
            ml = new YMaps.YMapsML("createml.php");
            gCollection.add(ml);
            map.addOverlay(gCollection);
            YMaps.Events.observe(ml, ml.Events.Fault, function (ml, error) {
            alert('Ошибка: ' + error);
            });
            });

YML вообще такая хитрая чтука, которая требует чтобы ваш файл был доступен из интернетов.

Посмотрите фаербагом откуда он грузиться - с серверов яндекса, которые этот файл с вас забирают.

Но, судя по всему, у них это не получается.

На счет доступности из интернета я в курсе, файл createml.php лежит на сервере одного из предыдущих проектов, я просто удалил в посте эту часть адреса. К сожаление проблема не в этом.

Ну раз так - может покажите( в личке? ) прямой url на этот файл?

Выборка нескольких тестовых записей из базы, если хоть одно поле будет содержать поле с русскими символами то появляется ошибка описанная выше.

Русские символы в cp1251 - 100%

а вот <gml:name> - в UTF. Достаточно открыть этот файл в ФФ(а потом перейти в исходный код и поиграться с кодировкой)

Все спасибо. Помогло объявление кодировки в подключении скриптов и убрал подключение кодировки при генерации ml файла.

Михаил Королев
28 января 2016, 05:35

Если у вас YmapsML динамически генерится скриптом - дело возможно не в кодировке, не забудьте настроить, чтобы он обязательно отдавал Content-type = text/xml.

C кодировками сайта и API проблем нет - вот например мой GPS-Помощник - сайт в 1251 и скрипты яндекса я подключаю, добавив объявление кодировки:

 

а сам динамический YmapsML в UTF-8, так-же явно объявляет свою кодировку

+ объявляет свой ContentType как text/xml