![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| slavenk |
|
|||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Здравствуйте!
Сейчас разбираюсь с юникодом в перл. У меня появилась такая проблема:
Для данного кода должно выдать utf8 flag: is utf8 а выдает: utf8 flag: no utf8 В чем может быть проблема? Пример писал по следующей статье: UTF Perl Practice, или как использовать UTF-8 в перле |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Потому что вы записали в строку два байта. Перл "не догадывается", без вашей помощи, как эти байты интерпретировать) Чтобы строку из байт проинтерпретировать как строку, записанную в utf8, надо выполнить utf8::decode($bad_string_with_utf8_flag).
|
|||
|
||||
| slavenk |
|
|||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Т.е. получается, в приведенной статье ошибка:
|
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Напишите автору)
|
|||
|
||||
| slavenk |
|
|||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Т.е. я так понял, что данная строка ("\x{d0}\x{90}") не имеет UTF-флага, UTF-флаг имеет каждый октет и чтобы Perl воспринимал данную строку как строку с UTF-флагом, нужно преобразовать ее в "нормальное" представление ("\x{410}") с помощью utf8::decode?
|
|||
|
||||
| slavenk |
|
||||||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Что-то я запутался!
Например, мы имеем три переменные:
Названия переменных говорят сами за себя, т.е. "\x{410}" - это настоящая Unicode строка, при проверке на utf8::is_utf8 выдает true "А" - строка без utf-флага, т.е. по-сути набор байтов "\x{d0}\x{90}" - "поломанная" строка без utf-флага Но вот незадача - Data::Dumper выводит для строки $bad_string_without_utf8_flag строку 'А', а не "\x{d0}\x{90}". А все потому, что строка не имеет utf-флага. Для того, чтобы поднять utf-флаг, необходимо выполнить:
Самое интерестное, что если к строке $string_without_utf8_flag применить функцию utf8::upgrade, мы получим строку "\x{d0}\x{90}" с поднятым utf-флагом Добавлено через 10 минут и 24 секунды Из данных рассуждений получается следующее: чтобы вышеприведенные пример из статьи был правильным (корректным), необходимо вручную выставить utf-флаг на строку "\x{d0}\x{90}". Другими словами, для данного кода
данная статья будет корректна, и Data::Dumper будет нормально отображать строку "\x{d0}\x{90}", а utf8::is_utf8 будет давать 1 (true) Это сообщение отредактировал(а) slavenk - 16.7.2012, 17:40 |
||||||
|
|||||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
perlunicode
В статье пишется, что это два символа юникод. На самом деле это два байта. |
|||
|
||||
| slavenk |
|
||||||||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Действительно:
Единственно, не могу понять, как правильно перевести слово "ord" в комментарии
|
||||||||
|
|||||||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
По смыслу получается
ords, видимо, образовано от функции ord(), или от слова, от которого образована функция ord(). Это сообщение отредактировал(а) Pfailed - 17.7.2012, 12:48 |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
>слова, от которого образована функция ord
Ordinal |
|||
|
||||
| slavenk |
|
|||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
||||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Насколько я понял upgrade() говорит сколько байт нужно что бы представить переданную последовательность, как буквы в utf-8. По два байта на каждый non-ASCII символ, итого 4.
Попробуйте функцию length() на этой последовательности, она должна возвратить 2. |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
>По два байта на каждый non-ASCII символ
Вообще, для перлового понимания utf-8, это 2-13. Но для общепринятого юникода - 2-4. А length на utf-8 строке вернёт её длину в символах, а не байтах. Ради чего всё и затевается. Чтобы посмотреть, что творится внутри строки, надо использовать Devel::Peek'овский Dump.
Это сообщение отредактировал(а) DurRandir - 17.7.2012, 15:27 |
|||
|
||||
| slavenk |
|
|||
|
TheAthlete ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Большое спасибо за код! Я так понял, только в последнем примере utf8-флаг не установлен. А CUR - это число байтов
|
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
>slavenk
Да |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |