2013-08-24 2 views
1

Я пытаюсь разобрать XML-файл (http://jstryczek.blox.pl/rss2), который говорит, что его набор символов - ISO-8859-2. Моя база данных находится в UTF-8, поэтому я хочу преобразовать ее в UTF-8.Преобразование ISO-8859-2 в UTF-8 (польские символы)

Для этого я бегу следующий на струне:

$content = iconv('ISO-8859-2', 'UTF-8//TRANSLIT', $content); 

По какой-то причине, я получаю обратно нечетное кодировку, так что:

Gdzie są różnice 

проступает как:

Gdzie sÄ róşnice 

Есть ли объяснение, почему польские символы не проходят? Не поддерживает ли UTF-8 их?

+0

UTF-8 поддерживает всех польских персонажей, я уверен. – solusipse

+0

Какая база данных вы используете, как определяются столбцы, как вы храните текст в базе данных и как вы ее извлекаете? UTF-8 отлично поддерживает эти символы. Фактически, сайт stackoverflow полностью находится в UTF-8, и, как вы видите, у вас не возникло проблем с их отправкой. – Joni

+0

Я использую MariaDB со столами в UTF8, клиентское соединение также UTF8. Я думаю, что какое-то неявное преобразование происходит где-то, просто не знаю, где. – hukir

ответ

1

Кажется, что этот текст уже закодирован в utf-8, поэтому нет необходимости его декодировать. Когда я сохранил этот файл в UTF-8 и побежал:

<?php 
$content = 'Gdzie są różnice'; 
$content = iconv('ISO-8859-2', 'UTF-8//TRANSLIT', $content); 
print $content; 

Я получил это:

Gdzie sÄ róşnice 

Что это именно неверный текст, вы получили.

Просто сохраните текст как есть, это уже utf-8.

+0

Затем сервер сообщает о неправильном кодировании, так как он проходит через Content-Type: text/xml; кодировка = ISO-8859-2. Когда я ничего не делаю, я получаю либо «?» или сброшенные символы для символов, отличных от ascii. То же самое, если я просто скручиваю URL-адрес, я получаю «?» в консоли UTF8. Есть предположения? – hukir

+0

@hukir Возможно, я был неправ, и кодировка действительно ISO-8859-2. Можете ли вы сохранить результат конвертации в файл и проверить его кодировку? – user4035

+0

Я использовал curl -O для сохранения файла напрямую, и он сохранялся с ISO-8859-1 с испорченными символами. Приводит меня к мысли, что это проблема с сервером, с которого я получаю данные. Похоже, что это сервер Windows, который может вызывать проблемы, когда мой сервер Ubuntu его извлекает. – hukir

-1
<?php 
$content = 'Gdzie są różnice'; 
$content = mb_convert_encoding($content, "ISO-8859-2", "UTF-8"); 
print $content; 
?> 
3

Я исправлю это, изменив строку на json, а затем замените все польский специальные знаки на html-код. Я добавляю ниже своего результата:

 $specialChars = [ 
     '\u0105', # ą 
     '\u0107', # ć 
     '\u0119', # ę 
     '\u0142', # ł 
     '\u0144', # ń 
     '\u00f3', # ó 
     '\u015b', # ś 
     '\u017a', # ź 
     '\u017c', # ż 
     '\u0104', # Ą 
     '\u0106', # Ć 
     '\u0118', # Ę 
     '\u0141', # Ł 
     '\u0143', # Ń 
     '\u00d3', # Ó 
     '\u015a', # Ś 
     '\u0179', # Ż 
     '\u017b', # Ż 
    ]; 

    $polishHtmlCodes = [ 
     '&#261;', # ą 
     '&#263;', # ć 
     '&#281;', # ę 
     '&#322;', # ł 
     '&#322;', # ń 
     '&#243;', # ó 
     '&#347;', # ś 
     '&#378;', # ź 
     '&#380;', # ż 
     '&#260;', # Ą 
     '&#262;', # Ć 
     '&#280;', # Ę 
     '&#321;', # Ł 
     '&#323;', # Ń 
     '&#211;', # Ó 
     '&#346;', # Ś 
     '&#377;', # Ż 
     '&#379;', # Ż 
    ]; 

    $result = str_replace($specialChars, $polishHtmlCodes, json_encode($string)); 
    var_dump(json_decode($result)); 

// prints 
// e.g. 'Różowe okulary' 
Смежные вопросы