Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Кодировки perl, mysql


Автор: Fenderovna 29.5.2013, 04:56
Есть сайт на perl. Все в cp 1251. Получаем данные из формы (аякс) и должны скриптом записать их в базу данных. Прежде использовалась бд в ср1251. В коде присутствуют функции перекодирования вида:
Код

$Text      = encode("Windows-1251", decode("UTF-8", $Text));

Теперь мигрируем на новую в utf-8. Никак не получается адекватно писать кириллицу. Нид хэлп. 

Автор: Jimy 29.5.2013, 08:12
может при соединении к базе выполнить:
Код

SET NAMES cp1251;

смысл приведенного perl-кода не ясен, тем более если вы говорите "Все в cp 1251".

Автор: Fenderovna 29.5.2013, 08:17
set names к результату не приводит
все в ср1251 кроме аякса, который всегда работает в утф8, соответственно отдает параметры также в нем

Автор: Pfailed 29.5.2013, 10:27
Код

$dbh->{mysql_enable_utf8} = 1;


Автор: ginnie 29.5.2013, 11:17
Fenderovna, я не понял, в чем именно проблема? Какие данные в БД пишутся неадекватно?
Еще укажите, что выдает
Код

SHOW VARIABLES LIKE 'character\_set\_%'

Автор: Fenderovna 30.5.2013, 03:48
Цитата(Pfailed @  29.5.2013,  10:27 Найти цитируемый пост)
Выделить всёкод Perl
1:
    
$dbh->{mysql_enable_utf8} = 1;


безрезультатно


Цитата(ginnie @  29.5.2013,  11:17 Найти цитируемый пост)
Какие данные в БД пишутся неадекватно?


любые кириллические

character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system latin1

Автор: igorold 30.5.2013, 07:53
Код

$Text      = encode("Windows-1251", decode("UTF-8", $Text));


Перекодировка в примере - это перед записью в базу или после чтения из базы?

Непонятно, что значит всё в cp1251.

В базе данные в какой кодировке хранятся? какая ось на сервере? Какая кодировка страницы в браузере?
Видимо linux - какая там установлена кодировка?

Похоже вы просто запутались в кодировках ...


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51a560736ccc19a44a000002#findElement_E7045_51a6db646ccc19b133000357_0

Автор: Fenderovna 30.5.2013, 08:06
Перед записью
В utf-8
Debian 4
win-1251

Автор: igorold 30.5.2013, 08:25
т.е. данные в базе хранятся в кодировке utf-8, а вы перед записью в базу кодируете данные в кодировку Windows-1251, а зачем?

Если данные в базе хранятся в utf-8, то и пишите туда данные в этой кодировке.
А после чтения из базы, делайте перекодирование перед отправкой браузеру в нужной кодировке.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51a560736ccc19a44a000002#findElement_E7045_51a6e2bd6ccc19c826002bd2_0

Автор: igorold 30.5.2013, 08:27
Может вам так надо писать:

Код

$Text      = encode("UTF-8", $Text);


??

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51a560736ccc19a44a000002#findElement_E7045_51a6e3356ccc19d340000213_0

Автор: ginnie 30.5.2013, 11:33
Fenderovna, покажите еще
Код

SHOW CREATE TABLE table_name

для таблицы, в которую Вы записываете данные. Надо посмотреть какие там указаны кодировки.
igorold Вам правильно указал, что перекодировать в cp1251 перед записью в БД не нужно, т.к. у Вас
Код

character_set_client utf8

Укажите еще, как Вы определяете, что данные в базу записались неправильно?

P.S. Я надеюсь, Вы понимаете значения переменных
Код

character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_results utf8
character_set_server latin1

если нет, обязательно почитайте про них в документации по MySQL.

Автор: warlock000 10.6.2013, 07:51
Простые правила, без конвертации, итд итп.

1) Если контент в utf-8 то:

1.1) 

Код

$dbh->do("set names utf8");
$dbh->do("SET CHARACTER SET utf8");


1.2) Кодировка документа (скрипта) - UTF-8 (иногда без БОМ), юзай нотепад ++


2) Если контент CP1251

2.1)
Код

$dbh->do("set names CP1251");
$dbh->do("SET CHARACTER SET CP1251");


2.2) Кодировка документа (скрипта) - ANSI


3) Если совсем всё плохо, CP1251 + utf-8

3.1) 
Код

use Encode;


3.2)
Код

$dbh->do("set names utf8");
$dbh->do("SET CHARACTER SET utf8");


3.3)  Кодировка документа (скрипта) - UTF-8

3.4) Конвертируем 
Код

Encode::from_to($test, 'utf-8', 'windows-1251');


3.5) Не забываем про грабли с регулярками, если используется Encode, конвертируем всё в utf8 если даже контент в utf8.

Всё вышеперечисленное спасает от различных граблей с регулярками и исключает проблеммы с кодировками.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)