Я работаю над турецким веб-сайтом, который хранит много искаженных турецких символов в базе данных MySQL, например:
- ş as þ
- ı as ý
- ğ as ð
- Ý as İ
Я не могу изменить данные в базе данных, потому что база данных обновляется ежедневно, и новые данные снова будут содержать некорректные символы. Поэтому моя идея состояла в том, чтобы изменить данные в PHP вместо изменения данных в базе данных. Я попробовал несколько шагов:
Турецкие символы отображаются неправильно
Исправить турецкий код ошибки Html / PHP (iconv?)
Проблема отображения турецкого языка PHP
Проблема кодировки PHP MYSQL (турецкие символы)
Я использую PHP-MySQLi-Database-Class доступно на GitHub с utf8 в качестве кодировки.
Я даже пытался заменить искаженные символы на str_replace, например:
$newString = str_replace ( chr ( 253 ), "ı", $newString );
У меня вопрос, как я могу решить проблему, не меняя символы в базе данных? Есть ли лучшие практики? Это хороший вариант просто заменить персонажей?
РЕДАКТИРОВАТЬ:
решил это с помощью
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />
Два решения хороши
Проблема кодировки PHP MYSQL (турецкие символы)
Проблема отображения турецкого языка PHP
Также вы можете установить конфигурацию на phpMyAdmin
Операции> Параметры таблицы> Сопоставление> выберите utf8_general_ci
если вы создаете таблицы, то уже редактируйте структуры сортировки
SELECT CONVERT(CONVERT(UNHEX('d0dddef0fdfe') USING ...) USING utf8);
latin5 / iso-8859-1
шоу ĞİŞğış
latin1 / iso-8859-9
шоу ÐÝÞðýþ
Вы путаете две одинаковые кодировки; см. первый абзац в https://en.wikipedia.org/wiki/ISO/IEC_8859-9 .
«Сортировка» предназначена только для сортировки. Но сначала вам нужно изменить CHARACTER SET
на латынь5. Затем измените параметры сортировки на latin5_turkish_ci. (Поскольку это значение по умолчанию для latin5, никаких действий предпринимать не нужно.)
это может достаточно внести изменения в MySQL: РЕДАКТИРОВАТЬ 3
NO, this is probably wring -- ALTER TABLE tbl CONVERT TO CHARACTER SET latin5;
Увидев больше проблемы, этот «2-ступенчатый ALTER», вероятно, правильно:
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET latin5 ...;
Сделайте это для каждой таблицы. Не забудьте сначала проверить это на копии ваших данных.
2-х ступенчатый ALTER полезно, когда байтов верны, но CHARACTER SET
не является.
CONVERT TO
следует использовать, когда персонажи верны, но вы хотите другую кодировку (и CHARACTER SET
). Увидеть Дело 5.
Редактировать 1
E7
а также FD
и cp1250, dec8, latin1 и latin2 для ç
а также ý
, FD
в латинице есть ı
, Я пришел к выводу, что ваша кодировка latin1
не latin5
,
Вы говорите, что не можете изменить «сценарии». Давайте посмотрим на ваши ограничения. Вы ограничены в INSERT
боковая сторона? Или SELECT
боковая сторона? Или оба? Что представляет собой текст; HTML? MySQL готов перейти с latin1 на / с latin5, и вы вставляете / выбираете (основываясь на нескольких настройках). И / или вы могли бы лгать HTML (через метатег), чтобы заставить его интерпретировать байты по-разному. Пожалуйста, изложите детали потока данных.
Редактировать 2
Учитывая, что HEX в таблице E7FD6B6172FD6C6D6173FD6E61
и он должен быть представлен как çıkarılmasına
, … Обратите внимание, особенно вторая буква должна отображаться как ı
(Турецкая без точек я), не ý
(маленький Y с острым), правильно?
Начните с попытки
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9"/>
Это должно дать вам `latin5 рендеринг, как вы уже узнали. Ссылка IANA.
Что касается «Лучшей практики», то это будет включать изменение способа вставки текста. Вы заявили, что это запрещено.
По-видимому, у вас есть символы латинского 5, хранящиеся в столбце latin1. Поскольку латиница 1 не включает проверку, вы можете без проблем вставлять и извлекать символы латиницы 5.
Это не относится к желанию иметь турецкий сопоставление. При необходимости я, возможно, смогу придумать способ указать турецкий порядок в конкретных заявлениях; пожалуйста, предоставьте пример заявления.