кодировка символов теряется при обработке файла .txt с названиями стран с помощью PHP

Я обрабатываю текстовый файл с названиями стран из ISO-3166, чтобы извлечь в массив только названия стран. Проблема в том, что когда я вывожу массив, специальные символы для некоторых стран теряются или меняются:

$country_1 = fopen("./country_names_iso_3166.txt", "r");        
while( !feof($country_1) ) {  // go through every line of file
$country = fgets( $country_1 );
if( strstr($country, ",") )         // if country name contains a comma
    $i = strpos( $country, "," ); // index position of comma
else
    $i = strpos( $country, ";" );   // index position of semicolon
$country = substr( $country, 0, $i );   // extract just the country name
$countries[] = $country;
}

Итак, теперь, когда я вывожу массив, например, второе название страны должно быть ÅLAND ISLANDS, однако оно выводится как LAND ISLANDS... Пожалуйста, посоветуйте, как это исправить.


person sjking    schedule 11.07.2011    source источник


Ответы (2)


Вместо этого попробуйте использовать строковые функции с поддержкой многобайтности. mb_strstr(), mb_strpos(), mb_substr() (в основном просто префикс с mb_).

person Marc B    schedule 11.07.2011
comment
Я думаю, что это не должно быть случаем в этой конкретной ситуации. - person Gedrox; 11.07.2011
comment
@ user839163: Как вы смотрите на вывод? Через браузер? Текстовый редактор? - person Marc B; 11.07.2011
comment
Я вывожу в веб-браузер с помощью echo или printf, а вывод для специальных символов с акцентами теряется/изменяется. Я вывожу тот же вывод в файл с file_put_contents, и специальные символы сохраняются. - person sjking; 14.07.2011
comment
Каждое приложение, поддерживающее Unicode, будет иметь разные правила обработки ввода и того, что они будут использовать в качестве набора символов по умолчанию. Браузер выберет один способ, какой бы редактор вы ни использовали для файлов, выберет другой. - person Marc B; 14.07.2011
comment
Я понял. Считываемый текстовый файл, содержащий названия стран и коды стран ISO-3166, не был установлен в UTF-8. PHP был недостаточно умен, чтобы понять это, поэтому я изменил кодировку символов текстового файла на UTF-8, и проблема была исправлена. Спасибо за вашу помощь. - person sjking; 15.07.2011

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

(Удалена ошибка в том, что ISO-3166 является кодировкой)

person Gedrox    schedule 11.07.2011
comment
ISO 3166 — это не набор символов, это спецификация ISO для сокращений кодов стран (например, «ca» = канада). - person Marc B; 11.07.2011
comment
верно, ISO-3166 — это спецификация кодов стран, известная как стандарт. Я должен был быть менее двусмысленным. Он также содержит полные названия стран, предшествующие аббревиатурам. - person sjking; 14.07.2011