Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   кодировака UTF-8 в XHTML, PostgreSQL (http://forum.oszone.net/showthread.php?t=80166)

Demiurg 28-02-2007 12:49 556381

кодировака UTF-8 в XHTML, PostgreSQL
 
Web-приложение, страничка с формой для логина на XHTML 1.0 UTF-8, форма обрабатывается php скриптом, который сверяет
Код:

$string = "md5".md5($password.$login);
if ($data[0] == $string){ ... }

где $data[0] - (SELECT passwd FROM pg_shadow WHERE usename LIKE '$login').
База PostgreSQL - UTF8. Вобщем логина не получается. Раньше для логина пользователей заводил отдельные таблицы для пользователей и групп, сейчас хочу воспользоваться нативными средствами PostgreSQL... раньше работало, но раньше и странички и база были в KOI8... а тут такой гемор с кодировками при работе с XMLHttpRequest, что решил лучше уж сейчас на UTF-8 переходить, чем потом, когда приложение разрастётся...
Скрипт login.php простейший (пока), выводит только md5 суммы.
Для отладки стал выводить (echo) получившуюся md5 сумму и сумму, которую извлекаю из базы, на экране все сходится, только комментарии на русском языке - кракозябры... стоит в браузере поставить жестко UTF8 - сумма которую я вычисляю, в UTF-8 уже другая... а сумма, которую я извлекаю из базы остаётся без изменения при переключении кодировок в браузере (при переключении, на экране свой вид не меняет)... как я понимаю, $_POST['login'] и $_POST['password'] попадают в login.php в кодировке отличной от UTF-8... логичный вопрос, а почему?
Фу, объяснил как мог... :)

Sham 28-02-2007 16:41 556476

Demiurg а сам скрипт какую кодовую страницу использует? Все должно соответствовать...

Demiurg 28-02-2007 17:04 556486

он никакую таблицу не использует, т.е. ни каких HTML заголовков в нем нет, но сама кодировка скрипта - UTF-8. После его исполнения браузер не знает кодировку документа, потому вывод (echo) - вместо русских букв кракозябры... а md5 суммы по внешнему виду совпадают, как только меняю в браузере на UTF-8, сразу видны русские буквы, а вид подсчитанной суммы изменяется (вид хеша из БД не изменяется)...
login.php без смены кодировки в браузере:
Код:

---кракозябры---
pass = md572c4bf92e86a141127e41e9ca1265a6f <- это сумма извлеченная из базы
hash = md572c4bf92e86a141127e41e9ca1265a6f <- это подсчитанная md5 сумма

меняем кодировку в браузере (без перезагрузки странички) [Вид->Кодировка->UTF8] (что бы увидеть русский текст, а не кракозябры):
Код:

Неверное имя пользователя или пароль.
pass = md572c4bf92e86a141127e41e9ca1265a6f
hash = md5d41d8cd98f00b204e9800998ecf8427e

^- вот так преобразуется страница после установки кодировки в UTF8...
Пробовал в начале скрипта написать:
Код:

setlocale(LC_ALL,'ru_RU.UTF-8');
безрезультатно.

Sham 28-02-2007 17:30 556496

Цитата:

После его исполнения браузер не знает кодировку документа
перед выводом:
Код:

header("Content-Type: text/html; charset=UTF-8");
Цитата:

'ru_RU.UTF-8'
Где взял? Может просто "UTF-8"?

Demiurg 28-02-2007 19:27 556528

Цитата:

'ru_RU.UTF-8'
в инете где-то нарыл. Исправление на UTF-8 тоже ничего не дало.

Sham 28-02-2007 20:48 556552

md5 из базы то при какой кодировке создавался (когда в базу загонялся)? Такую же и надо юзать у клиента, или перекодировать данные клиента перед хешированием (с пом. iconv). Видимо из UTF-8 в koi8-r...
PHP код:

$string "md5".md5(iconv("UTF-8""KOI8-R"$password.$login)); 


mar 01-03-2007 13:24 556789

ru_RU.UTF-8 - это для установки кодировок локали на unix-машине - к броузеру отношение явно не имеет =)

Demiurg 01-03-2007 17:22 556891

Пароль создавался в базе UTF-8 (у базы родная кодировка UTF-8), потому когда мы его извлекаем он уже в UTF-8; $_POST['login'] и $_POST['password'] приходят к нам со странички index.xhtml (которая в UTF-8)... неужели данные, которые мы вводим в форму, имеют кодировку локали ОС? (в случае с FreeBSD - это KOI8-R, Windows - cp1251)?

Sham 01-03-2007 19:32 556932

Demiurg не понятно... в какой кодировке слали свои пароли пользователи, когда регистрировались? KOI8? Тады и сравнивать надо предварительно перекодировав в KOI8... кодировка базы - дело десятое...

Demiurg 02-03-2007 12:28 557190

Sham Данные, которые мы вводим в форму, имеют кодировку локали ОС (вне зависимости от того какую кодировку имеет документ с формой)???

Sham 02-03-2007 18:47 557361

Demiurg вводишь то - да (а по другому и никак), но afaik форма идет в кодировке странички (при преобразовании данных формы в тело запроса используется указанная (текущая) кодировка страницы)...

mar 02-03-2007 21:08 557398

Demiurg
кодировка локали сервера вообще роли не играет.
В остальном, по-моему Sham все изложил.

Demiurg 06-03-2007 13:15 558493

В серверном скрипте убрал setlocale, оставил только header(...), все заработало...


Время: 02:46.

Время: 02:46.
© OSzone.net 2001-