Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать строку в юникоде? 
:(
    Опции темы
amorphius
Дата 28.4.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



Есть такой участок кода:
Код

$a = "фываолдж";
for(my $i=0;$i<8;$i++)
{
      print substr($a,$i,1)." ";
}

Все просто, выводит через пробел все буквы строки (она будет русской). В заголовке странице указана кодировка -  charset=UTF-8, текст скрипта сохранен в юникоде, но все равно сервер выдает вместо нормальной русской строки вопросительные знаки. Если убрать пробел между буквами, то все отображает корректно. Подскажите пожалуйста в чем проблема?
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.4.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



1) если не ошибаюсь для юникода есть специальня прагма:
Код

use utf8;

Попробуйте ее.

2) Вам нужно найти то место где происходит сбои. Проверьте, что скаляр ($a) действительно содержит именно юникод
Код

use utf8;
use Devel::Peek;
my $a = "Привет";
Dump($a);

Это покажет вам внутренню структуру скаляра. Там должен быть флаг UTF8.
Кстати, покажите-ка эту отладку..

3) Вы печатаете символы в терминал. Если у него кодировка не UTF8 (ну например у терминала Windows - cp1251, у FreeBSD - koi8-r)
То вам нужно преобраховывать выходные данные с помощью
Код

print(encode("KOI8-R", substring($a, $i, 1)) . " ");






--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amorphius
Дата 28.4.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



Dump абсолютно ничего не вернул
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.4.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



amorphius, а он ничего и не возвращает - он выводить на печать.
Модуль не забывли импортировать ?

use Devel::Peek;

пришлите код целиком


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amorphius
Дата 28.4.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



Код

#!/usr/bin/perl
use strict;
use CGI ':standart';
use utf8;
use CGI::Cookie;
use Devel::Peek;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

print "Content-type: text/html\n\n";

my $a = "фівапролдж";
Dump($a);

PM MAIL   Вверх
sir_nuf_nuf
Дата 28.4.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



а вот оно что.. CGI

Dump($a) - выводит все в STDERR  - смотрите логи веб-сервера. Там должны быть данные.
Или если нет возможности - попробуйте  перенаправить STDERR в STDOUT
Код

open STDERR, ">&STDOUT";
Dump($a);


P.S.  вы забыли кстати вывести HTTP заголовок с указанием кодировки. Может быть в этом проблема


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amorphius
Дата 29.4.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



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

use utf8;

наполнение для сайта берется из базы, в базе все кодировки установлены на юникод, после соединения с базой сразу выполняю
Код

set names utf8

в странице указано charset=UTF-8, тем не менее база возвращает данные в иероглифах. Как мне прочесть еще в нормальном виде данные из базы?
PM MAIL   Вверх
sir_nuf_nuf
Дата 29.4.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



amorphius, так. База MySQL ?

Вообщем все правильно сделано. 
Только лучше делать не set names utf8;

А при установлении соединения
Код

$conn = DBI->connect(
    "DBI:mysql:database=DB_SCHEMA;host=DB_HOST;port=DB_PORT",
    $DB_USER, 
    $DB_PASS,
    {
        RaiseError => 1,
        mysql_enable_utf8 => 1    # ВОТ ЭТО ВАЖНО!
    },
)


Дело в том, что перл помечает utf строки особым флагом (который видно через Devel::Peek) - без этого флага - он не будет считать, что строки в utf. От этого могут быть глюки.

Советы такие:

1) Сделайте Dump того, что непосредственно возвращает база.. ну любую ячейку из запроса сдампите и посмотрите стоит ли там utf флаг.
2) Проверьте, что в база на самом деле возвращает utf. Например подключитесь каким-нть utf клиентом (пойдет обычный текстовый mysql при условии, что кодировка консоли utf8 - сделайте set names utf8, сделайте выборку и посмотрите что вернулось)


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amorphius
Дата 1.5.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



проблема решена, правада не таким способом
PM MAIL   Вверх
shamber
Дата 2.5.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



amorphius, ну так поделитесь с общественностью
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.