Я читаю много текстов из различных RSS-каналов и вставляю их в свою базу данных.
Конечно, в каналах используется несколько разных кодировок символов, например, UTF-8 и ISO 8859-1.
К сожалению, иногда возникают проблемы с кодировкой текстов. Пример:
«Ss» в «Fußball» в моей базе данных должно выглядеть так: «ÂŸ». Если это «В», оно отображается правильно.
Иногда «ß» в «Fußball» в моей базе данных выглядит так: «ÃŸÂŸ». Тогда это отображается неправильно, конечно.
В других случаях «ß» сохраняется как «ß», то есть без каких-либо изменений. Тогда это также отображается неправильно.
Что я могу сделать, чтобы избежать случаев 2 и 3?
Как я могу сделать все в той же кодировке, желательно UTF-8? Когда я должен использовать utf8_encode()
, когда я должен использовать utf8_decode()
(ясно, каков эффект, но когда я должен использовать функции?) И когда я ничего не должен делать с вводом?
Как мне сделать все одинаковое кодирование? Возможно с функцией mb_detect_encoding()
? Могу ли я написать функцию для этого? Итак, мои проблемы:
- Как узнать, какую кодировку использует текст?
- Как мне преобразовать его в UTF-8 - какой бы ни была старая кодировка?
Будет ли функция, как эта работа?
function correct_encoding($text) {
$current_encoding = mb_detect_encoding($text, 'auto');
$text = iconv($current_encoding, 'UTF-8', $text);
return $text;
}
Я проверял это, но это не работает. Что с этим не так?
источник
Ответы:
Если вы примените
utf8_encode()
к уже строке UTF-8, она вернет искаженный вывод UTF-8.Я сделал функцию, которая решает все эти проблемы. Это называется
Encoding::toUTF8()
.Вам не нужно знать, какова кодировка ваших строк. Это может быть Latin1 ( ISO 8859-1) , Windows-1252 или UTF-8, или строка может иметь их сочетание.
Encoding::toUTF8()
преобразует все в UTF-8.Я сделал это, потому что служба давала мне все данные, смешивая UTF-8 и Latin1 в одной строке.
Использование:
Скачать:
https://github.com/neitanod/forceutf8
Я включил другую функцию,
Encoding::fixUFT8()
которая будет исправлять каждую строку UTF-8, которая выглядит искаженной.Использование:
Примеры:
будет выводить:
Я преобразовал функцию (
forceUTF8
) в семейство статических функций в классе с именемEncoding
. Новая функция естьEncoding::toUTF8()
.источник
Сначала вы должны определить, какая кодировка была использована. Когда вы анализируете RSS-каналы (вероятно, через HTTP), вы должны прочитать кодировку из
charset
параметраContent-Type
поля заголовка HTTP . Если его нет, прочитайте кодировку изencoding
атрибута инструкции обработки XML . Если этого тоже не хватает, используйте UTF-8, как определено в спецификации .Редактировать Вот что я, вероятно, сделал бы:
Я бы использовал cURL для отправки и получения ответа. Это позволяет вам установить определенные поля заголовка и получить заголовок ответа. После получения ответа вы должны проанализировать HTTP-ответ и разделить его на заголовок и тело. Затем заголовок должен содержать
Content-Type
поле заголовка, содержащее тип MIME и (надеюсь)charset
параметр с кодировкой / charset. Если нет, мы проанализируем XML PI на наличиеencoding
атрибута и получим оттуда кодировку. Если это также отсутствует, спецификации XML определяют использование UTF-8 в качестве кодировки.источник
charset=
и ,encoding=
а не только в соответствующих положениях. И в-третьих, вы не проверяете, принята ли заявленная кодировка.Определить кодировку сложно.
mb_detect_encoding
работает путем угадывания, основываясь на количестве кандидатов, которые вы передаете. В некоторых кодировках некоторые последовательности байтов недопустимы, поэтому он может различать разных кандидатов. К сожалению, существует множество кодировок, в которых действительны одни и те же байты (но разные). В этих случаях нет способа определить кодировку; Вы можете реализовать свою собственную логику, чтобы угадать в этих случаях. Например, данные, поступающие с японского сайта, могут с большей вероятностью иметь японскую кодировкуДо тех пор пока вы имеете дело только с западноевропейскими языками, три основных кодировок , чтобы рассмотреть
utf-8
,iso-8859-1
иcp-1252
. Поскольку они являются значениями по умолчанию для многих платформ, о них также, скорее всего, сообщают неправильно. Например. если люди используют разные кодировки, они, вероятно, будут откровенны в этом, поскольку в противном случае их программное обеспечение будет очень часто ломаться. Поэтому хорошей стратегией является доверие к поставщику, если только кодировка не указана как одна из этих трех. Вы должны все еще перепроверить , что это действительно действует, используяmb_check_encoding
(обратите внимание , что действует не то же самое , как быть - тот же вход может быть справедливо для многих кодировок). Если это один из них, вы можете использоватьmb_detect_encoding
различать их. К счастью, это довольно детерминистично; Вам просто нужно использовать правильную последовательность обнаружения, которая естьUTF-8,ISO-8859-1,WINDOWS-1252
.Как только вы обнаружили кодировку, вам нужно преобразовать ее во внутреннее представление (
UTF-8
это единственный разумный выбор). Функцияutf8_encode
преобразуетсяISO-8859-1
вUTF-8
, поэтому она может использоваться только для этого конкретного типа ввода. Для других кодировок используйтеmb_convert_encoding
.источник
Действительно хороший способ для реализации
isUTF8
-функции можно найти на php.net :источник
mb_check_encoding($string, 'UTF-8')
Эта таблица содержит список некоторых распространенных предостережений, связанных с обработкой UTF-8 в PHP: http://developer.loftdigital.com/blog/php-utf-8-cheatsheet
Эта функция обнаружения многобайтовых символов в строке также может оказаться полезной ( источник ):
источник
Немного хедз-ап. Вы сказали, что «ß» должно отображаться как «Â» в вашей базе данных.
Вероятно, это связано с тем, что вы используете базу данных с кодировкой символов Latin-1 или, возможно, ваше соединение PHP-MySQL установлено неправильно, то есть P считает, что ваш MySQL настроен на использование UTF-8, поэтому он отправляет данные как UTF-8 , но ваш MySQL считает, что PHP отправляет данные, закодированные в формате ISO 8859-1, поэтому он может еще раз попытаться закодировать отправленные данные в формате UTF-8, вызывая такие проблемы.
Посмотрите на mysql_set_charset . Это может помочь вам.
источник
Ваша кодировка выглядит так, как будто вы дважды кодировали в UTF-8 ; то есть из некоторого другого кодирования в UTF-8 и снова в UTF-8. Как будто у вас был ISO 8859-1, преобразованный из ISO 8859-1 в UTF-8, и обработанная новая строка как ISO 8859-1 для другого преобразования в UTF-8.
Вот некоторый псевдокод того, что вы сделали:
Ты должен попытаться:
mb_detect_encoding()
или что вы хотите использоватьЭто предполагает, что в «среднем» преобразовании вы использовали ISO 8859-1. Если вы использовали Windows-1252, то конвертируйте в Windows-1252 (latin1). Оригинальная исходная кодировка не важна; тот, который вы использовали в ущербном, второе преобразование.
Это мое предположение о том, что произошло; еще очень мало, что вы могли бы сделать, чтобы получить четыре байта вместо одного расширенного байта ASCII.
Немецкий язык также использует ISO 8859-2 и Windows-1250 (Latin-2).
источник
Интересно то ,
mb_detect_encoding
и вmb_convert_encoding
том , что порядок кодировок ты предлагаешь действительно имеет значение:Таким образом, вы можете захотеть использовать определенный порядок при указании ожидаемых кодировок. Тем не менее, имейте в виду, что это не надежно.
источник
if ($input_is_not_UTF8) $input_is_windows1252 = true;
. См. Также: html.spec.whatwg.org/multipage/…Вам необходимо проверить набор символов на входе, так как ответы могут быть закодированы с различными кодировками.
Я принудительно отправляю весь контент в UTF-8, выполняя обнаружение и перевод, используя следующую функцию:
Эта процедура превратит все переменные PHP, поступающие с удаленного хоста, в UTF-8.
Или игнорируйте значение, если кодировка не может быть обнаружена или преобразована.
Вы можете настроить его под свои нужды.
Просто вызовите его перед использованием переменных.
источник
Разработка кодировки символов RSS-каналов кажется сложной . Даже нормальные веб-страницы часто опускают или лгут об их кодировке.
Таким образом, вы можете попытаться использовать правильный способ обнаружения кодировки, а затем вернуться к какой-либо форме автоопределения (угадывание).
источник
charset
/,encoding
если для: опишите кодировку, в которой закодированы данные.Я знаю, что это старый вопрос, но я считаю, что полезный ответ никогда не повредит. У меня были проблемы с моей кодировкой между настольным приложением, SQLite и переменными GET / POST. Некоторые из них будут в UTF-8, другие - в ASCII, и в основном все облажается, когда в игру вступают иностранные символы.
Вот мое решение. Он очищает ваш GET / POST / REQUEST (я пропустил куки, но вы можете добавить их при желании) на каждой странице загрузки перед обработкой. Хорошо работает в шапке. PHP выдаст предупреждения, если не сможет автоматически определить кодировку источника, поэтому эти предупреждения подавляются с помощью @.
источник
Я проверял решения для кодирования, так как незапамятных времен , и эта страница, вероятно, завершает годы поиска! Я проверил некоторые из упомянутых вами предложений и вот мои заметки:
Это моя тестовая строка:
Я делаю INSERT, чтобы сохранить эту строку в базе данных в поле, которое установлено как
utf8_general_ci
Набор символов моей страницы - UTF-8.
Если я сделаю INSERT просто так, в моей базе данных у меня есть персонажи, вероятно, с Марса ...
Поэтому мне нужно конвертировать их в какой-то «вменяемый» UTF-8. Я попытался
utf8_encode()
, но все еще инопланетные персонажи вторгались в мою базу данных ...Поэтому я попытался использовать функцию,
forceUTF8
опубликованную под номером 8, но в базе данных сохраненная строка выглядит так:Таким образом, собирая дополнительную информацию на этой странице и объединяя ее с другой информацией на других страницах, я решил свою проблему с помощью этого решения:
Теперь в моей базе данных есть строка с правильной кодировкой.
ПРИМЕЧАНИЕ: только примечание, чтобы заботиться, в функции
mysql_client_encoding
! Вам необходимо подключиться к базе данных, потому что эта функция хочет идентификатор ресурса в качестве параметра.Но я просто делаю эту перекодировку перед вставкой, так что для меня это не проблема.
источник
UTF-8
клиентскую кодировку для MySQL в первую очередь? Не нужно было бы ручное преобразование таким образомВсе просто: когда вы получаете что-то, что не является UTF-8, вы должны закодировать это в UTF-8.
Итак, когда вы выбираете определенный канал, это ISO 8859-1, проанализируйте его
utf8_encode
.Однако, если вы получаете канал UTF-8, вам не нужно ничего делать.
источник
php.net/
mb_detect_encoding
или
Я действительно не знаю, каковы результаты, но я бы посоветовал вам просто взять некоторые из ваших каналов с различными кодировками и попробовать,
mb_detect_encoding
работает или нет.автообновление
короткое для "ASCII, JIS, UTF-8, EUC-JP, SJIS". он возвращает обнаруженную кодировку, которую можно использовать для преобразования строки в utf-8 с помощью iconv .
Я не проверял это, так что никаких гарантий. и, возможно, есть более простой способ.
источник
@harpax, который работал для меня. В моем случае это достаточно хорошо:
источник
После сортировки ваших php-скриптов не забудьте сообщить mysql, какую кодировку вы передаете и хотели бы получить.
Пример: установить набор символов utf8
Передача данных utf8 в таблицу latin1 в сеансе ввода / вывода latin1 дает эти неприятные проблемы с птицами. Я вижу это через день в магазинах oscommerce. Назад и четвертое это может показаться правильным. Но phpmyadmin покажет правду. Сообщая mysql, какую кодировку вы передаете, она будет обрабатывать преобразование данных mysql для вас.
Как восстановить существующие зашифрованные данные MySQL является еще одной темой для обсуждения. :)
источник
Эта версия для немецкого языка, но вы можете изменить $ CHARSETS и $ TESTCHARS
источник
Получить код из заголовков и преобразовать его в UTF-8.
источник
Ÿ
является кракозябры дляß
. В вашей базе данных вы можете иметь шестнадцатеричныйВы не должны использовать какие-либо функции кодирования / декодирования в PHP; вместо этого вы должны правильно настроить базу данных и соединение с ней.
Если задействован MySQL, см .: Проблема с символами utf8; то, что я вижу, не то, что я храню
источник
Я нахожу решение здесь http://deer.org.ua/2009/10/06/1/
Я думаю, что @ - плохое решение, и внесите некоторые изменения в решение с deer.org.ua;
источник
Ответ с наибольшим количеством голосов не работает. Вот мой и надеюсь, что это помогает.
источник
Когда вы пытаетесь работать с несколькими языками, такими как японский и корейский, у вас могут возникнуть проблемы. mb_convert_encoding с параметром 'auto' работает не очень хорошо. Установка mb_detect_order ('ASCII, UTF-8, JIS, EUC-JP, SJIS, EUC-KR, UHC') не помогает, так как она обнаружит EUC- * неправильно.
Я пришел к выводу, что, пока входные строки исходят из HTML, он должен использовать 'charset' в метаэлементе. Я использую Simple HTML DOM Parser, потому что он поддерживает недопустимый HTML.
Приведенный ниже фрагмент извлекает элемент title из веб-страницы. Если вы хотите конвертировать всю страницу, вы можете удалить некоторые строки.
источник
У меня была та же проблема с phpQuery ( ISO-8859-1 вместо UTF-8 ), и этот хак мне помог:
mb_internal_encoding('UTF-8')
,phpQuery::newDocumentHTML($html, 'utf-8')
,mbstring.internal_encoding
И другие манипуляции не принимали никакого эффекта.источник
Попробуйте без 'авто'
То есть:
вместо того:
Более подробную информацию можно найти здесь: mb_detect_encoding
источник