Как заставить PHP использовать правильную кодировку? - PullRequest
1 голос
/ 29 июля 2010

Я делаю проверку KSSN (корейский идентификационный номер) в PHP, используя базу данных MySQL. Я проверяю, работает ли он, используя вызов file_get_contents для внешнего сайта.

Проблема в том, что запросы (с хангул / корейскими символами в них) используют неправильную кодировку. Когда я повторяю строку, корейские символы просто заменяются знаками вопроса.

Как я могу использовать корейский язык? Должен ли я что-то изменить в базе данных тоже? Какой должна быть кодировка?

Исходный код PHP и дамп SQL: http://www.multiupload.com/RJ93RASZ31

ПРИМЕЧАНИЕ. Я использую Apache (HTML), а не CLI.

Ответы [ 3 ]

2 голосов
/ 29 июля 2010

Вам необходимо:

  1. сообщить браузеру, какую кодировку вы хотите получить при отправке формы, установив Content-Type по заголовку или <meta>, как в ответе Авива.

  2. сообщить базе данных, в какой кодировке вы отправляете ее в байтах, используя mysql_set_charset().

В настоящее время выиспользуя EUC-KR в базе данных, вероятно, вы захотите использовать эту кодировку в обоих вышеупомянутых пунктах.В этом столетии я бы предложил вместо этого использовать UTF-8 повсеместно для всех веб-приложений / баз данных, так как восточноазиатские многобайтовые кодировки являются анахроничным неприятным явлением.(С потенциальными последствиями для безопасности, как будто mysql_real_escape_string не знает правильную кодировку, многобайтовая последовательность, содержащая ' или \, может проникнуть через SQL-инъекцию.)

Однако, если enpang.comвы используете EUC-KR для кодирования параметра URL Name, который вам понадобится либо для EUC-KR, либо для перекодировки значения имени из UTF-8 в EUC-KR для этой цели, используя iconv().(Мне не ясно, какую кодировку enpang.com используют в качестве параметров URL для их службы проверки имен; в любом случае, я всегда получаю одинаковые результаты.)

1 голос
/ 29 июля 2010

В основном все проблемы с кодировками проистекают из того факта, что они смешаны и / или неверно истолкованы.

Строка (текст) - это последовательность байтов в определенном порядке.Строка кодируется с использованием некоторой конкретной кодировки, которая сама по себе не является ни правильной, ни неправильной, ни чем-либо еще.Проблема в том, что когда вы пытаетесь прочитать строку, последовательность байтов, принимая неправильную кодировку.Байты, закодированные с использованием, например, KS X 1001, просто не имеют смысла, когда вы читаете их, предполагая, что они UTF-8, вот откуда взялись вопросительные знаки.

Сайт, на котором вы получаете текстfrom отправляет его вам в каком-то определенном наборе символов, допустим, KS X 1001. Предположим, что ваш собственный сайт использует UTF-8.Встраивание потока байтов, представляющих текст в кодировке KS X 1001, в середину текста в кодировке UTF-8 и указание браузеру интерпретировать весь сайт, поскольку UTF-8 приводит к тому, что кодированный текст KS X 1001 не имеет смысла для анализатора UTF-8.

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
KSKSKSKSKSKSKSKSKSKSKSKSKSKSKSKSKSKSKSKS
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

будет отображаться как

Hey, this is UTF-8 encoded text, awesome!
???????I?have?no?idea?what?this?is???????
Hey, this is UTF-8 encoded text, awesome!

. Чтобы решить эту проблему, конвертируйте извлеченный текст в UTF-8 (или любую другую кодировку, которую вы используетена Вашем сайте).Посмотрите на заголовок Content-Type этого другого сайта, он должен сообщить вам, в какой кодировке находится сайт. Если этого не произойдет, сделайте предположение.

1 голос
/ 29 июля 2010

Я не знаю кодировку, но если вы используете HTML для отображения результатов, вы должны установить кодировку html

     <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">

Вы также можете использовать iconv (функция php) для преобразованияcharset к другому charset http://php.net/manual/en/book.iconv.php

И последнее, но не менее важное: проверьте кодировку базы данных для таблиц.

Но я думаю, что в вашем случае вам нужно будет только изменить метатег.

...