powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / perl utf8 и PGSql utf8
13 сообщений из 13, страница 1 из 1
perl utf8 и PGSql utf8
    #35532748
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пише проект регистрации опозданий/отсутствий учащихся образовательного учреждения.
Возникла неожиданная (для меня по крайней мере) проблема. Код на perl в UTF8 (gedit), кодировка postgresql UTF8 (initdb --locale ru_RU.UTF8), сама база - тоже UTF8. Из скрипта в базу кладутся ФИО, например. В базе они видны нормально, но при SELECT из базы некоторый русские буквы становятся черти-чем. Например, русская "Л" заменяется при выводе в HTML-страничку "�›". Таже ситуация с некоторыми другими буквами ("ы", например). В чем может быть проблема?

Заранее спасибо.

Доп. инфа:
Сервер:
Код: plaintext
1.
2.
3.
Fedora Core  9 
[root@shutffl 2late_v_0. 2 ]# uname -a
Linux shutffl.xxx.xxx.ru  2 . 6 . 25 . 14 - 108 .fc9.i686 # 1  SMP Mon Aug  4   14 : 08 : 11  EDT  2008  i686 i686 i386 GNU/Linux

perl:
Код: plaintext
1.
2.
[root@shutffl 2late_v_0. 2 ]# perl -v
This is perl, v5. 10 . 0  built for i386-linux-thread-multi

PostgreSQL:
Код: plaintext
1.
2.
-bash- 3 . 2 $ postmaster --version
postgres (PostgreSQL)  8 . 3 . 3 
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35532991
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кратко то проблема может быть в чем угодно.

если подробнее то надо методично вывести данные на каждом этапе их обработки и посмотреть после какого этапа появляються "кракозябрики".

Из собственного опыта использования веб/перл/постгрес/utf8 могу сказать что следует проверить две вещи:
1. Url encode / decode -- данные из веб формы приходят в форме url-encode, посмотрите как вы их де-кодируете перед засылкой в базу. Убедитеь что сама веб форма указывает браузеру что данные должны быть url-encoded и utf8.

2. Шрифты: вопросы вместо букАв обышно возникают в ситуации когда декодинкг был произведен правильно, но в шрифте который должен отображать тескт нету нужных символов. Символы которых нету заменяются обычно вопросам.

Вообщем вам надо просто внимательно сесть и разобтаться, т.к. бага в перле или постгресе который бы заменял быкву "Л" на знак вопроса точно нету.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35532993
DAISER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shutfflВ базе они видны нормально, но при SELECT из базы некоторый русские буквы становятся черти-чем. Например, русская "Л" заменяется при выводе в HTML-страничку "�›".
Скорее всего проблема не с PostgreSQL, а настройкой кодировки на web-сервере. Проверьте, не стоит ли у вас на web по-умолчанию cp1251.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35534720
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы. Попробую.
На счет encode/decode - я использую CGI.pm, который, вроде, должен сам следить за такими вещами.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35535140
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, не помогло. В http.conf стоит UTF8. Пробовал менять на ru_RU.UTF8 - тоже самое.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35535439
xt-v0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAISER shutfflВ базе они видны нормально, но при SELECT из базы некоторый русские буквы становятся черти-чем. Например, русская "Л" заменяется при выводе в HTML-страничку "�›".
Скорее всего проблема не с PostgreSQL, а настройкой кодировки на web-сервере. Проверьте, не стоит ли у вас на web по-умолчанию cp1251.
Ещё возможно, что при формировании страницы "склеивается" текст с установленным флажком utf8 и без флажка.
В DBD::Pg по-умолчанию флаг utf-8 не ставится.
Попробуйте либо включить pg_enable_utf8, либо поставить флаг вручную (perldoc Encode).
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35536072
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, будет понятнее....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
....

use CGI qw/:all/;

....

my $cgi = new CGI;

# if submit new teacher
	if ( $s_add_teacher )
	{
		if ($cgi->param("lastname") and $cgi->param("firstname") and $cgi->param("middlename"))
		{
			my $fio = $cgi->param("lastname") . " " . $cgi->param("firstname") . " " . $cgi->param("middlename");
		
			if ( not &find_teacher($fio) )
			{
				
				my $dbh = DBI->connect($config::sql{"dns"}, $config::sql{"username"}, $config::sql{"password"}) or die DBI->errstr;
	  
			  my $sth = $dbh->prepare(
			  	"
			  	INSERT INTO
			  		teachers(fio)
			  	VALUES(?)
			  	"
			  );
			  
			  $sth->execute($fio) or die $sth->errstr;
			  
			  $dbh->disconnect();
			}
			else
			{
				$r .=
					$cgi->font({-color=>"red"}, "Преподаватель уже существует");
			}
		}
		else
		{
			$r .=
					$cgi->font({-color=>"red"}, "Не заполнены поля ФИО");
		}
	}

Код: plaintext
 $r 
- это переменная, которая возвращается функцией и содержит код HTML.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35536104
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал
Код: plaintext
$dbh->{pg_enable_utf8}= 1 ;
Из базы текст получается нормальным(!). Зато вся остальная страница - "Класс". Как pg_enable_utf8 может влиять на CGI? Есть идеи?
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35536609
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод Live HTTP Header:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
GET /2late_v_0. 2 /adminka/index.pl?e=teachers_work HTTP/ 1 . 1 

Host: localhost

User-Agent: Mozilla/ 5 . 0  (X11; U; Linux i686; en-US; rv: 1 . 9 . 0 . 1 ) Gecko/ 2008071615  Fedora/ 3 . 0 . 1 - 1 .fc9 Firefox/ 3 . 0 . 1 

Accept: text/html,application/xhtml+xml,application/xml;q= 0 . 9 ,*/*;q= 0 . 8 

Accept-Language: ru,en-us;q= 0 . 7 ,en;q= 0 . 3 

Accept-Encoding: gzip,deflate

Accept-Charset: windows- 1251 ,utf- 8 ;q= 0 . 7 ,*;q= 0 . 7 

Keep-Alive:  300 

Connection: keep-alive

Cache-Control: max-age= 0 



HTTP/ 1 .x  200  OK

Date: Fri,  12  Sep  2008   10 : 46 : 32  GMT

Server: Apache/ 2 . 2 . 9  (Fedora)

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf- 8 

Content-Language: ru

...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35537338
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я может чего не понимаю... что значит "Из базы текст получается нормальным(!). Зато вся остальная страница - "Класс".

ваш код ничего не отдает клиенту кроме html'я " с текстом "Преподаватель уже существует" или "Не заполнены поля ФИО". В каком месте возникает ""Из базы текст получается нормальным(!)"?

В любом случае этот вопрос по програмированию перле с использошанием модуля CGI.pm и в принципе не связан с базой данных. Прочем наверняка поднимался в перловом разделе и спец форумах подымался 100ню раз.

Я не CGI.pm не использую , но ваше утверждение "encode/decode - я использую CGI.pm, который, вроде, должен сам следить за такими вещами." спорно, особенно очитывая результат вида КласÑ. Сказать что у вас не так тяжело особенно т.к. не весъ код приведен. Например в начале файла должна стоятъ прагма
Код: plaintext
use utf8;
чтобы все strings были помечены перлом как ютф8. Далее попробуйте вытащить CGI параметры в "сыром виде" прамо из запроса и распечататъ. Далее распечатайте резулътат как
Код: plaintext
[Encode::decode_utf8($your_unmodified_param_value_from_query_string)
. и сравните с результатом от
Код: plaintext
cgi->param("your_param")
. Еще посмотрите доку к модулю на предмет того что делает метод
Код: plaintext
CGI::charset()

Вообще лучше спроститъ в форуме по програмированию на перле.
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35537384
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробали работать в другой кодировке? если вы работаете под WIN то создайте пользователя c client_encoding='WIN1251'
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35537510
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся порнография в Linux))))
...
Рейтинг: 0 / 0
perl utf8 и PGSql utf8
    #35537538
shutffl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
# if submit delete teacher
	if ( $s_delete_teacher )
	{
		my $default_teacher = &get_default_teacher_id;
		
		my $dbh = DBI->connect($config::sql{"dns"}, $config::sql{"username"}, $config::sql{"password"}) or die DBI->errstr;
		
		my $teacher_to_delete = $cgi->param("teacher_to_delete");
	  
	  my $sth = $dbh->prepare(
	  	"
	  	UPDATE
	  		classes
	  	SET
	  		id_teacher = $default_teacher
	  	FROM
	  		teachers t
	  	WHERE
	  		t.fio = ?
	  		AND
	  		id_teacher = t.id
	  	"
	  );
	  $sth->execute($teacher_to_delete) or die $sth->errstr;
	  
		my $sth = $dbh->prepare(
	  	"
	  	DELETE FROM
	  		teachers
	  	WHERE
	  		fio = ?
	  	"
	  );
	  $sth->execute($teacher_to_delete) or die $sth->errstr;
	  
	  $dbh->disconnect();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#form: delete teacher
	$r .=
		$cgi->start_form({-method=>"get", -action=>"./index.pl"}) .
			$cgi->hidden(-name=>"e", -value=>"teachers_work") .
			
			$cgi->start_table({-border=>"0", -cellpadding=>"0", -cellspacing=>"0"}) .
				$cgi->start_Tr({-align=>"center", -valign=>"center"}) .
					$cgi->start_td({-align=>"right"}) . "Преподаватель:" . $cgi->end_td .
					$cgi->start_td({-align=>"left"}) . $cgi->popup_menu(-name=>"teacher_to_delete", -values=>[@teachers_fio]) . $cgi->end_td .
				$cgi->end_Tr .
				
				$cgi->start_Tr({-align=>"center", -valign=>"center"}) .
					$cgi->start_td . $cgi->end_td .
					$cgi->start_td({-align=>"center"}) . $cgi->br . $cgi->submit(-name=>"s_delete_teacher", -value=>"Удалить") . $cgi->end_td .
				$cgi->end_Tr .
			$cgi->end_table .
		$cgi->end_form .
		
		$cgi->hr;

Если это поможет....
Появилась идея! Нет ли какой старой проблемы с типом в БД? Базу делал в PgAdmin. Для строковых ставил character varying. Сейчас пробую с character.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / perl utf8 и PGSql utf8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]