UTF8 -> Сложность Latin1, PHP

Я теряю символы с акцентом.

С PHP я загружаю файл xml, который использует UTF8, а мой PHP-скрипт использует Latin1. Я не могу преобразовать UTF8 в Latin1.

Я пробовал это:

$meta=mb_convert_encoding($meta,'CP1252','UTF-8');

и

$meta=mb_convert_encoding($meta,'UTF-8');
$meta=mb_convert_encoding($meta,'CP1252','UTF-8');

Но в любом случае символы с акцентом ломаются и превращаются в 2 символа.

Вход:

<title>First book of zoölogy</title>

Выход:

<title>First book of zoo?logy</title>

Я сам разобрался, см. мой ответ ниже. Спасибо всем за помощь!


person Alasdair    schedule 19.03.2012    source источник
comment
Пожалуйста, покажите пример ввода и вывода, дайте более подробную информацию и код. Это слишком расплывчато, чтобы отвечать конкретно.   -  person deceze♦    schedule 19.03.2012
comment
Я добавил образец ввода и вывода.   -  person Alasdair    schedule 19.03.2012
comment
Этот пример показывает результат первого фрагмента кода? Вы уверены, что текст, который вы вводите в функцию, закодирован там в кодировке UTF-8?   -  person deceze♦    schedule 19.03.2012
comment
В заголовке метафайла указано, что это UTF-8, но я полагаю, что это может быть ложью.   -  person Alasdair    schedule 19.03.2012
comment
Вы пробовали $meta = utf8_decode($meta) ?   -  person iceduck    schedule 19.03.2012
comment
Я сделал, но это тоже не сработало. Что сработало, так это iconv, см. мой собственный ответ ниже.   -  person Alasdair    schedule 19.03.2012


Ответы (3)


Измените сортировку таблиц, сделайте Utf8_general_ci и перед подключением к базе данных используйте:

mysql_set_charset("utf8");

Я думаю, это может решить вашу проблему.

person Petris Rodrigo Fernandes    schedule 19.03.2012
comment
Все установлено на Latin1, потому что это то, что я хочу использовать, а не UTF8. Я уже установил для mysql_set_charset значение Latin1. Акцентированные символы должны быть в состоянии быть преобразованы из UTF8 в Latin1 в самом начале, что они и есть, после этого UTF8 не используется, но где-то символы повреждаются. - person Alasdair; 19.03.2012
comment
@Аласдер. Почему вы хотите продолжать использовать Latin1, когда utf8 предлагает гораздо больше? - person Ben; 19.03.2012
comment
Потому что он использует меньше байтов, и мне не нужна UTF8. - person Alasdair; 19.03.2012
comment
@Аласдер. Меньше байтов не обязательно верно, utf8 - это кодировка с переменной шириной. Базовое подмножество не займет больше места, чем latin1. И вам может не понадобиться utf8 сейчас, но вы будете счастливы выбрать его, когда вам нужно расширить все, что вы делаете, до международного набора символов. - person Ben; 19.03.2012
comment
Это никогда не выйдет за пределы латинского алфавита, и причина использования Latin1 заключается в том, что я могу иметь доступный для поиска индекс на 255 символов в базе данных MySQL. - person Alasdair; 19.03.2012
comment
@Аласдер. Столбец utf8 varchar длиной 255 позволит вам сохранить 255 символов utf8 и создать для него индекс.. (но не верно для char столбец) - person Ben; 19.03.2012

Это исправило это:

$meta=iconv('UTF-8','CP1252//TRANSLIT',$meta);

Раньше я не знал о iconv, думал, что можно работать только с mb_strings, но iconv работает очень хорошо.

person Alasdair    schedule 19.03.2012

Возможно, кодировка по умолчанию вашего сервера MySQL - UTF-8. Попробуйте следующее:
вставьте следующий запрос после сведений о подключении к MySQL:

mysql_query("SET NAMES latin1");
person Valeh Hajiyev    schedule 19.03.2012
comment
Это не так, по умолчанию используется latin1, и теперь кажется, что эта проблема возникает до того, как строка попадает в базу данных, поэтому это проблема PHP, а не проблема MySQL. - person Alasdair; 19.03.2012