LINUX.ORG.RU

Есть ли в перле проблемы с юникодом?

 


1

1

Есть древний двух-с-половиной-тысячестрочник на перле, который рисует аскии арт. Я хочу заменить некоторые символы аскии на юникод, но даже простая замена | на │ приводит к тому, что результат разъезжается. Символы вставляю как есть, без всяких \x1234.

Виноват ли перл?


Ответ на: комментарий от Xenesz

в той, что у убунты. Не, юникодные символы печатает, но куда-то деваются пробелы по крайней мере справа. Я хочу определить, это что-то в логике программы или особенности перла.

vvff
() автор топика
Ответ на: комментарий от vvff

Кинь код на пейстбин какой-нибудь и ссылку сюда. Или хотя бы строчки с «use» и несколько строк, в которых арт выводится, покажи.

BTW, локаль к дистру не прибита, и их один набор для всех.

Xenesz ★★★★
()

Много лет храню все перловые исходники в utf8 и данные процессятся в этой кодировке. Проблем нет. Зато встречал много человеков поленившихся прочесть perldoc perlunicode.

outtaspace ★★★
()

Мне вот это помогло:

use utf8;

gag ★★★★★
()
Ответ на: комментарий от gadfly

У меня вот это в одну строчку нормально выглядит:

print "апрöäü|│ads\n";
А utf8 мне нужен был для корректного сохранения с помощью writeexcel.

А есть маленький примерчик, где binmode обязательно нужен?

gag ★★★★★
()
Ответ на: комментарий от gag
perl -e 'use utf8; binmode STDOUT, ":utf8"; print "ололо"'

Без binmode будет ругаться. Не будет ругаться без binmode и 'use uft8', но тогда строка не будет юникодной (что, впрочем, в данном примере не имеет значения).

gadfly ★★
()

в перле

прочитал иначе

lazyklimm ★★★★★
()

Есть ли в перле проблемы с юникодом?

Судя по последней новости о Перле, проблемы как раз-таки у всех остальных.

buddhist ★★★★★
()
Ответ на: комментарий от gadfly
perl -e 'utf8::is_utf8 "апрöäüß|│ads" or die "not unicode"'
not unicode at -e line 1.

Ага, т.е. wchar. Почему же оно тогда правильно на utf8-терминале отображается?

gag ★★★★★
()
Ответ на: комментарий от gag

Наоборот, char.

perl -e 'print "щщщ"'|od -t x1
0000000 d1 89 d1 89 d1 89
perl -e 'print length "щщщ"'
6
perl -e 'use utf8; print length "щщщ"'
3
Разницы в том, как оно выводится нет, разница во внутреннем представлении.

gadfly ★★
()
Ответ на: комментарий от gadfly

Терминал там обычный, utf-8. Просто если не сказать perl в какой кодировке нужно выводить данные в STDOUT, то он считает, что нужно выводить в ISO-8859-1. Если во внутреннем представлении данные хранятся не в utf8, то perl не делает над ними никакого преобразования перед выводом:

perl -le 'print "à"'
# output is: à"
Но если внутри utf8, то perl знает как можно преобразовать данные чтобы они были читаемыми в кодировке STDOUT
perl -Mutf8 -le 'print "à"'
# output is: �
perl -Mutf8 -le 'print "à"' | iconv -f ISO-8859-1
# output is: à
Возникает вопрос, почему кариллицу, например, perl выводит в первозданном виде, добавляя лишь предупреждение «Wide character in print». А потому, что в ISO-8859-1 нет символов кириллицы.

Посмотрим что будет если перевести STDOUT в koi8-r

perl -Mutf8 -M'open=:std,:encoding(koi8-r)' -le 'print "мама"' | iconv -f koi8-r
# output is: мама
Таким образом, если у вас во внутреннем представлении данные в utf8, то необходимо явно перевести поток вывода в нужную вам кодировку, а не надеяться, что все выйдет в первозданном виде и лишь добавятся предупреждения «Wide character in print»
perl -CS -Mutf8 -le 'print "à"'
# output is: à

Olegymous ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.