Qp encoding на perl


Содержание

perl и кодировки

Как стандартными средствами perl можно перекодировать текст в переменной из одной кодировки в другую.
Спасибо!

Re: perl и кодировки

Открытие через «трубу» iconv достаточно стандартное средство?

Re: perl и кодировки

мне нужно текст в переменной переконвертировать

Re: perl и кодировки

Re: perl и кодировки

Пардон, всей кучей запихал :-))

#!/usr/bin/perl open (A, «|iconv -f koi8-r -t cp1251|»); $variable=»Кодировка»; print A $variable; @lines=; print @lines; close(A);

Re: perl и кодировки

Re: perl и кодировки

спасибо, вернусь с шашлыков — проверю. =)

Re: perl и кодировки

А что тебе насоветовал r_asian — ужыс! Точно сисадмин, блин :)

Re: perl и кодировки

Ну, согласный я, вариант не самый оптимальный, зато работает и выпить не просит :-)

Re: perl и кодировки

Это не просто «не самый оптимальный вариант», это просто жопа, а не вариант. Представь, из твоего варианта сделали функцию, и вставили её в cgi-шку, которая получает данные откуда-то и конвертирует их в нужную клиенту кодировку. На каждый чих звать iconv(1). А когда эту цгишку позовут 100 пользователей сразу?

Re: perl и кодировки

Ну вся, блин, пошел я пить йад и топитьса в Волге. :-((

Re: perl и кодировки

iconv — кривое говно, обламывающееся на 50% текстов. Лучше уж recode использовать, оно дуракоустойчивее.

Re: perl и кодировки

2r_asian:
> Ну, согласный я, вариант не самый оптимальный, зато работает и выпить не просит :-)

Нет, твой вариант не работает _вообще_ :-(

Если бы ты использовал -w или use warnings, то увидел бы что-то типа:

Can’t open bidirectional pipe at ./pipe.pl line 3.

Конструкция типа open(A, «|some_command|») просто не работает,
о чем недвусмысленно написано в perldoc -f open:

You are not allowed to «open» to a command that pipes both in and out,
but see IPC::Open2, IPC::Open3, and «Bidirectional Communication with
Another Process» in perlipc for alternatives.

> Ну вся, блин, пошел я пить йад и топитьса в Волге. :-((

Йад может немного подождать, а вот чтение perldoc perlipc тебе
явно срочно необходимо.

P.S. И пожалуйста — всегда use warnings и use strict

Re: perl и кодировки

> P.S. И пожалуйста — всегда use warnings и use strict
Добавлю, всегда только про написании программы, и на стадии тестирования.
При ипользовании в работе эти две строчки лучше комментировать.
Потому что они жрут память немеренно.


Re: perl и кодировки

> При ипользовании в работе эти две строчки лучше комментировать. > Потому что они жрут память немеренно.

Это, грубо говоря, ложь. strict вообще влияет, в основном, на компиляцию .

Знаки Èíà вместо кириллицы на сайте написанном на Perl. Как исправить кодировку?

Переношу учебный портал одного института со старого сервера на новый.
На старом сервере: CentOS 5.11, Perl 5.8.6, Postgres, очень ограниченные права и много совершенно сторонних файлов.
Новый сервер: Debian 9.9, Perl 5.24.1 из коробки, и отдельно собранный 5.8.9, Postgres.
На новой версии Perl по понятной причине начались разные мелкие проблемы, решились все кроме одной.
Сайт работает в Win1251, вывод русского текста через print работает нормально, а вот через qq кракозябры вида ÈíГ.
Вот скриншот:

Перерыл массу мануалов, проверял локали, сверял настройки на двух серверах, но что то точно упускаю.
Поменять qq на print не решение.
От безысходности собрал древний Perl 5.8.9. Запустил на нём — всё тоже самое, только в лог ошибок пишется AH01215: Wide character in print at с указанием на строку, где как раз и печатаются кракозябры.
Подскажите пожалуйста, в какую сторону смотреть.
Последняя из идей: проверить и поставить модуль Locale::RecodeData::CP1251

UPD 24.09.19 Определил кодировки строк. В чистом Perl без Postgres всё работает правильно. Как только интерполируется строка из Postgres, всё ломается. Пример: запрашивается одна строка из Postgres, кодировка данных первого столбца win1251, второго x-mac-cyrillic(. ) если верить модулю perl Encode::Encoding::Detector, при подстановке данных из второго столбца кодировка результирующей строки ломается, отсюда и кракозябры.
После подключения к базе в postgres устанавливается client_encoding win-1251, если закомментировать эту строку и работать UTF-8 и конвертировать уже полученные строки в win-1251 на месте, всё работает правильно, но таких мест во всех файлах проекта — сотни, да и насчёт правильной записи обратно в базу я очень сомневаюсь.
Проверить кодировку той же строки на старом сервере нет возможности так как нет прав на установку модуля Encode::Encoding::Detector
Из старого сервера сливал бэкап и в UTF-8 и в win-1251 — конечный результат не меняется

Конечный вопрос: каким образом настроить Postgres или как слить бэкап таким образом, чтобы на результирующем сервере всё отработало правильно без глобальных изменений кода?

Мои поделки

Пропаганда

понедельник, 27 апреля 2015 г.

Perl. Правильное отображение кириллицы (русского шрифта) в командной строке и при чтении из файла

Получилось разрешить эту проблему, сопоставив сведения из двух типов источников. Один относился к теме перекодировки шрифтов в Perl’е (ссылка на источник), другой, к смене кодировки в консоле (ссылка на источник). Из первого узнаём как перекодировать в Перле и как открыть файл в определённой кодировке, из второго, в какую кодировку использовать при выводе текстовых данных в консоле.

Итак, чтобы текст на экране консоли был читабельным можно в настройках программы в которой пишется программный код Перл установить DOS кодировку (числовой код 866). Тогда весь текст кода будет в той же кодировки, что используется в консоли. Однако это приведёт к к проблемам с использованием русских букв в названии файлов, а также при записи русского текста во внешние файлы.
Поэтому более удобно использовать две функции decode и encode из модуля Encode . Обе функции имеют два параметра: decode («кодировка», «текст»), encode («кодировка», «текст»). Первая переводит текст из произвольной кодировки в некий внутренний формат перла, а вторая из внутреннего в любой другой. При этом перевести кодировку напрямую из произвольного формата в любой другой не получится.

Вот как это может выглядеть:

use Encode qw(decode encode) ;
my $text = ‘Русские буквы в системной кодировке windows 1251’ ;
$text = decode ( «cp1251» , $text );
$text = encode ( «cp866» , $text );
print $text ;

Для функции decode указывается параметр «cp1251» кодировки в которой написан текст. Если это unicode, то указывается «utf8» (или 4, 16, 32, 64). Для функции encode указывается кодировка «cp866» в которую будет перекодирован текст для вывода в консоли.

Можно использовать более короткую запись:

use Encode qw(decode encode) ;
my $text = ‘Русские буквы в кодировке unicode UTF8’ ;
print encode ( «cp866» , decode ( «utf8» , $text ));

Теперь пример как делается чтение из файла с произвольной кодировкой.

open ( my $fh, ‘ , «data.txt» );

Т.е. просто указывается параметр encoding(cp1251), где cp1251 кодировка текста в файле. При этом текст кодируется в некой внутренней перловской кодировке.
Данную операцию нужно проделывать обязательно для того, чтобы потом иметь возможность перекодировать текст в любую другую кодировку. При этом, чтобы в дальнейшем корректно отобразить в консоле текст полученный таким образом из файла, нужно использовать уже только функцию encode .

Perl: utf8 :: расшифровывает vs. Encode :: декодирования

У меня возникли некоторые интересные результаты , пытаясь разглядеть различия между использованием Encode::decode(utf8, $var) и utf8::decode($var) . Я уже обнаружил , что вызов бывших несколько раз на переменную, в конечном счете приведет к ошибке «Не удается декодировать строку широких символов в . » в то время как последний метод будет счастливо работать столько раз , сколько вы хотите, просто возвращение ложным.

Илон Маск рекомендует:  applet в HTML

Что у меня трудности с пониманием то , как length функция возвращает разные результаты в зависимости от того, какой метод используется для декодирования. Проблема возникает потому , что я имею дело с «двойным» закодированным utf8 текстом из внешнего файла. Чтобы продемонстрировать эту проблему, я создал текстовый файл test.txt со следующими Unicode символов в одной строке: U + 00e8, U + 00ab, U + 0086, U + 000A. Эти Unicode символы двойного кодирование символов Unicode U + 8acb, вместе с символом новой строки. Файл был закодирован на диск в UTF8. Затем я запускаю следующий сценарий PERL:

Это дает следующий результат:

Это то, что я хотел бы ожидать. Длина первоначально 7, потому что Perl считает, что $ тест просто серия байтов. После декодирования один раз, Perl знает, что $ тест представляет собой набор символов, которые utf8 кодировке (т.е. вместо того, чтобы вернуться в длину 7 байт, Perl возвращает длину 4-х символов, даже если $ тест еще 7 байт в памяти). После второго декодирования $ тест содержит 4 байта интерпретируются как 2 символа, который является тем, что я ожидал бы так Encode :: расшифровывает взял 4 кодовых точек, и интерпретировать их как utf8 кодировке байт, в результате 2 символов. Странно, когда я изменить код для вызова utf8 :: декодирования вместо (заменить весь $ тест = Encode :: декодирования ( «utf8», $ тест) с utf8 :: декодирования ($ тест))

Это дает почти идентичный выход, только результат длиной различен:

Похоже, Perl первый подсчитывает байты перед декодированием (как и ожидалось), а затем подсчитывает символы после первого декодирования, но затем подсчитывает байты снова после второго декодирования (не ожидается). Почему этот переключатель происходит? Есть ли упущение в моем понимании того, как эти функции декодирования работают?

Вы не должны использовать функции из utf8 модуля прагмы. Его документация говорит так:

Не используйте эту прагму ничего другого, чем говорить Perl, что ваш сценарий написан в кодировке UTF-8.

Всегда используйте модуль Encode , а также увидеть вопрос Контрольный список для перехода путь Unicode с Perl . unpack слишком низкий уровень, он даже и не даст вам проверки ошибок.

Вы собираетесь неправильно с предположением , что octects E8 AB 86 0A являются результатом UTF-8 дважды кодирующей символы 諆 и newline . Это представление одного UTF-8 кодировка этих символов. Возможно , вся путаница на вашей стороне происходит от этой ошибки.

length является unappropriately перегружен, в определенные периоды времени определяет длину в символах, или длину в октетах. Используйте лучшие инструменты , такие как Devel::Peek .


encoding question in perl

I have an encoding question and would like to ask for help. I notice if I choose «UTF-8″ as encoding, there are (at least) two double quotes » and “ . But when I choose «ISO-8859-1» as the encoding, I see the latter double quote becomes ¡° , or sometimes for example “ .

Could anyone please explain why this is the case? How can match “ and replace it with » using regexp in perl?

2 Answers 2

ISO-8859-1 is a one-byte-per-character encoding. The fancy Unicode double-quotes are not in the ISO-8859-1 character set. So what you are seeing is a multi-byte character represented as a sequence of ISO-8859-1 bytes.

To match these weird things, see the perlunicode man page, especially the \x <. >and \N <. >escape sequences.

To answer your question, try \x <201c>to match the Unicode LEFT DOUBLE QUOTATION MARK and \x <201d>to match the RIGHT DOUBLE QUOTATION MARK. You missed the latter in your question :-).

I should have provided my reference. Some nice gentleman in the UK has a page on ASCII and Unicode quotation marks. The plain vanilla ASCII/ISO-8859-1 double-quote is just called QUOTATION MARK.

SYNOPSIS

This module provide the same interface as MIME::QuotedPrint , but these functions are implemented in pure perl.

This module prov >

The following functions are provided:

encode_qp($str) encode_qp($str, $eol)

This function returns an encoded version of the string given as argument.

The second argument is the line-ending sequence to use. It is optional and defaults to «\n». Every occurrence of «\n» is replaced with this string, and it is also used for additional «soft line breaks» to ensure that no line is longer than 76 characters. You might want to pass it as «\015\012» to produce data suitable for external consumption. The string «\r\n» produces the same result on many platforms, but not all.

An $eol of «» (the empty string) is special. In this case, no «soft line breaks» are introduced and any literal «\n» in the original data is encoded as well.

This function returns the plain text version of the string given as argument. The lines of the result are «\n» terminated, even if the $str argument contains «\r\n» terminated lines.

Copyright 1995-1997,2002-2004 Gisle Aas.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Module Install Instructions

To install MIME::QuotedPrint::Perl, simply copy and paste either of the commands in to your terminal

For more information on module installation please visit the detailed CPAN module installation guide.

Поддержка Unicode

Начиная с Perl версии 5.6 в интерпретаторе была реализована поддержка Unicode на уровне языка. В данном тексте пойдет речь о том, зачем это нужно, как это можно использовать, и с какими проблемами вам придется столкнуться.

Оглавление

Каждый UTF формат обратим, то есть поддерживает преобразование из последовательности Unicode-символов и обратно без потерь, то есть: в результате преобразования любой последовательности Unicode-символов S в последовательность байтов и обратно мы получим опять S. Для достижения возможности преобразования без потерь в обе стороны, UTF формат должен определять преобразование для всех символов Unicode, даже невалидных.

Вольный сокращенный перевод What is a UTF?

Perl и Unicode

Unicode в Perl 5.6.x и 5.8.x

Поддержка Unicode в Perl 5.6 привязана к операциям, а не к данным, что требует использования прагмы «utf8» и только тогда, когда программист уверен, что все данные в кодировке UTF-8. Также, Perl 5.6 не поддерживает Unicode в регулярных выражениях, что очень сильно ограничивает круг возможностей.

Я знаю слишком мало о применении Unicode в 5.6, так что и писать об этом не могу. Все примеры и текст ниже касаются Perl 5.8.x. Eсли кто хочет, то может осветить особенности 5.6. Закиров Руслан [досье]

Как реализована поддержка в Perl


Любая структура данных (скаляр, массив, хеш. ) в Perl имеет набор флагов, которые отражают те или иные свойства объектов. Для реализации полноценной поддержки Unicode был выбран формат UTF-8 и введен одноименный флаг. Все функции, которые так или иначе работают со строками, учитывают флаг и интерпретируют данные по разному в зависимости от его значения. К таким функциям относятся: length, chr, ord, substr, join, регулярные выражения и прочие. Следующий пример демонстрирует различия в поведении (используемый модуль Encode включен в дистрибутив Perl начиная с Perl 5.8):

Одна и та же информация в двух форматах: последовательность байтов (октетов) в кодировке cp1251 с отключеным флагом и последовательность символов в кодировке UTF-8 с установленным флагом. Функция length в обоих случаях возвращает одно и то же значение, потому что в cp1251 для хранения одного символа используется один байт, а для строк без флага возвращается именно количество байт. Различия в поведении функций ord и substr видны явно. В целях эксперимента попробуйте отключить флаг UTF-8, для этого раскоментируйте строку Encode::_utf8_off($string); .

Какие кодировки поддерживаются в Perl

Как уже было сказанно выше, Perl преобразует из «старых» кодировок в UTF-8, для всех преобразований используется модуль Encode, то есть от этого модуля зависит сможете вы использовать преимущества автоматического преобразования данных.

Для каждой кодировки, которая поддерживается, определенно «каноническое» имя и возможно ряд синонимов. Так же названия кодировок не чуствительны к регистру букв, а пробелы заменяются на дефис.

Различные кодировки сгруппированы в модули, например поддержка кодировок UTF-* реализованна в модуле Encode::Unicode. Нет необходимости подгружать эти модули самостоятельно, но возможно для редко-используемых кодировок придется установить дополнительные модули со CPAN .

Посмотреть список всех канонических имен всех кодировок можно с помощью

или посмотреть канонические имена поддерживаемые отдельным модулем

Если вы не можете найти в списке необходимую кодировку, то возможно это синоним какой-либо другой кодировки. Можно использовать следующий небольшой скрипт для определения поддерживается ли та или иная кодировка, и является название каноническим или же это синоним:

Подробно о том какие кодировки поддерживаются смотрите perldoc Encode::Supported .

Perl и стандарты

Существует стандарт описывающий UTF-8 . Стандарт достаточно строгий в отношении того, что считается UTF-8 , а что нет. Например UTF-8 — это последовательность чисел в диапазоне от 0 до 0x10FFFF, но и в этом диапазоне есть запрещенные значения.

До perl 5.8.7 и Encode 2.10 в perl была реализована ограниченная поддержка стандарта, а именно не было полного контроля допустимых значений. С выходом perl 5.8.7 была представлена новая кодировка utf-8-strict , которая полностью соответствует стандарту UTF-8 и UTF-8 рекомендуемый синоним для данной кодировки. Для желающих использовать старую реализацию осталась utf8

Илон Маск рекомендует:  Новое секретное SEO оружие

Когда нельзя использовать Unicode

Нельзя использовать Unicode в следующих ситуациях (актуально для 5.8.x):

  1. названия пакетов/классов
  2. названия функций

Модули, прагмы, переменные и опции

use utf8;

Прагма позволяет указать, что код программы написан в кодировке UTF-8. Строковые константы, константные шаблоны в регулярных выражениях и имена переменных будут рассматриваться как строки в UTF-8 кодировке.

Прагма utf8 не влияет на работу потоков ввода/вывода (см. прагмы encoding и open).
Прагма так же не оказывает влияния на интерпретацию строк со сброшенным флагом UTF-8 (см. Конкатенация строк с флагом и без флага).

use encoding;

Многофункциональная прагма. Позволяет явно указать кодировку в которой написан ваш скрипт, например cp1251 или любую другую, которую поддерживает модуль Encode. Также вы можете управлять поведением стандартных потоков ввода/вывода (STD). И последнее, в случаях, когда интерпретатору perl необходимо преобразовать строку без UTF-8 флага в строку с флагом, то указанная кодировка будет использована для преобразования. Рассмотрим каждый из трех пунктов по отдельности.

  1. Автоматическая конвертация констант из кодировки указанной в UTF-8 c выставлением флага. Действие в данном случае очень похоже на действие прагмы utf8, за исключением того, что кодировку можно указать явно.
  2. Управление стандартными потоками ввода/вывода. Вы можете указать в какой кодировке интерпретатор должен выводить в стандартный поток вывода и/или из какой кодировки преобразовывать данные из стандартного потока ввода. То есть perl оперирует Unicode данными, а при выводе или вводе со стандартных потоков производит автоматическую конвертацию данных.
  3. Последний пункт более подробно рассмотрен в описании проблемы ниже. Вкратце, это единственная возможность указать perl’у как интерпретировать строки без флага, когда интерпретатору необходимо конвертировать строку в UTF-8 (по умолчанию используется latin-1).

Вывели коды букв и получили UTF-8 (первые четыре строки). В последней строке получили слово ‘тест’ в кодировке ‘koi8-r’, выведенное на ‘cp1251’ терминал.

use open; (прагма)

Прагма open — это вспогательный интерфейс для определения «уровеней» по умолчанию для всех потоков ввода/вывода. Вместо термина «уровень (layer)» так же используется термин «дисциплина (discipline)». В любых двух-аргументных вызовах open() , readpipe() (он же qx// ) и в подобных операторах, находящихся в пределах лексической области видимости этой прагмы, будут использованы указанные значения по умолчанию. Трех-аргументные вызовы не подвержены действию этой прагмы и вы должны указывать уровни самостоятельно.

С помощью подпрагмы IN можно указать из какой кодировки преобразовывать данные из стандартного потока ввода.

С помощью подпрагмы OUT можно указать в какой кодировке интерпретатор должен выводить данные в стандартный поток вывода.

Если вы хотите задать кодировку явно, то используйте :encoding(. )

Если вы хотите чтобы кодировки были выбраны автоматически в соответствии с установленной в системе локалью, то используйте :locale, пример:

Это аналогично этому

Если в вызове open() указан явный список уровней, то он добавляется к списку, который объявлен с помощью прагмы open.


Подпрагма :std сама по себе ни на что не влияет, но в сочетании с подпрагмой :utf8 или :encoding она назначает выбранную кодировку для стандартных файловых манипуляторов (STDIN, STDOUT, STDERR).
Например, если объявить прагму :utf8 для потоков ввода и вывода, то :std также установит :utf8 для файловых манипуляторов STDIN, STDOUT, STDERR.
В другом случае, если объявить прагму :encoding(koi8r) для потока вывода, то :std установит koi8r только для файловых манипуляторов STDOUT и STDERR.
Подпрагма :locale неявно включает подпрагму :std

Логика подпрагмы :locale

Если платформа поддерживает интерфейс langinfo(CODESET), то возвращаемое им значение используется как базовая кодировка прагмы open.
Если платформа подкачала, но объявлена прагма locale, то для установки базовой кодировки прагмы open используется часть (после .) значения переменных окружения LC_ALL и LANG (в этом по порядке) подходящая для названия кодировки (если она найдена).
Если первые два пункта безуспешны, но в значениях переменных окружения LC_ALL и LANG (в этом по порядке) найдено что-нибудь похожее на UTF-8, то базовой кодировкой прагмы open устанавливается :utf8. Если в значениях переменных окружения (LC_ALL, LC_CTYPE, LANG) найдена строка ‘UTF-8’ или ‘UTF8’ (не важно в каком регистре), то базовой кодировкой для стандартных файловых манипуляторов STDIN, STDOUT и STDERR, а также любых файловых манипуляторов открытых позднее устанавливается :utf8

Управление поведением по умолчанию при запуске интерпретатора

Начиная с версии 5.8.1 была добавлена опция интерпретатора -C , которая позволяет задать режимы работы с потоками ввода/вывода и массивом @ARGV по умолчанию.

I 1 данные поступающие с STDIN будут интерпретироваться как UTF-8
O 2 вывод данных в STDOUT будет производиться в кодировке UTF-8
E 4 вывод данных в STDERR будет производиться в кодировке UTF-8
S 7 I + O + E
i 8 UTF-8 включен по умолчанию для открываемых потоков ввода
o 16 UTF-8 включен по умолчанию для открываемых потоков вывода
D 24 i + o
A 32 предполагается, что элементы @ARGV закодированы в UTF-8
L 64 все остальные указанные опции будут активированы, только если пользователь использует UTF-8 локаль, например ru_RU.UTF-8

Первая группа IOES влияет на стандартные потоки ввода/вывода, смотрите описание прагмы encoding.

Вторая группа ioD влияет на поведение создаваемых потоков ввода/вывода. Для достижения подобного эффекта можно использовать трех-аргументный вызов open(), двух-аргументный вызов binmode() и прагму open.

Если опция указана без дополнительных параметров, просто, -C , то используется -CSDL .

В perl 5.8.0 такое поведение включено по умолчанию, что может стать причиной некоторых проблем. В perl 5.8.1 и выше по умолчанию используется значение 0.

Переменная окружения PERL_UNICODE является синонимом опции -С , но имеет более низкий приоритет и будет проигнорирована, если указана опция.

Во время выполнения кода, вам доступна для чтения «магическая» переменная $ <^UNICODE>, которая отражает состояние описанных выше настроек.

use bytes;

Прагма bytes позволяет переключить Perl в режим обработки строк как последовательность байтов, а не символов, даже если для строки установлен флаг UTF-8. Прагма отключает действие Unicode флага в пределах данной лексической области видимости.

Следующий пример демонстрирует действие прагмы:

Perl версии ниже 5.6 поставляется без прагмы bytes и если вы хотите сохранить совместимость кода с этими версиями, то можно использовать следующий блок кода:

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

Влияние на функции, регулярные выражения и остальное

Функция chr

Конвертирует число в символ, где число — это код символа. В версиях 5.8, с приходом unicode, действие функции немного расширилось, а точнее, если аргумнт число больше 255, то функция считает число code point’ом unicode и возвращает соответствующий символ в скаляре с установленным флагом UTF-8.

Функция ord

Конвертирует символ в число. Действие обратное функции chr, для символов с флагом возвращает значение code point’а Unicode.

Функция binmode

У функции появился второй аргумент LAYER , который позволяет указать слои (дисциплины) потока ввода/вывода. Более подробно доступные возможности описываются в другой статье , а в нашем случае наиболее интересны :utf8 , :bytes и :encoding(. ) .

Пример: Указываем кодировку файла.

Шаблон \w

Как уже говорилось unicode меняет поведение регулярных выражений, вернее не меняет, а использует дополнительную мета-информацию о симфолах, которую предоставляет Unicode. Согласно perldoc perlre шаблон \w совпадает с одним символом алфавита, десятичной цифрой или символом ‘_’, существует достаточно распространенное заблуждение, что это равнозначно шаблону [a-zA-Z0-9_] , но это конечно же неверно:

Примеры

iconv.pl

Простой скрипт конвертации текста из одной кодировки в другую:

Плагин для HTML::Mason

Веб-сервер, получая запрос от клиента, не имеет информации о кодировке сообщения. Декодирование и интерпретация строковых данных остается на совести програмиста. В HTML::Mason существует достаточно гибкая система плагинов, чтобы написать плагин, который сконвретирует все строки из последовательностей байтов в perl строки.

Код очень простой, но имеет небольшой недостаток — нельзя передавать данные не в UTF-8, хоть и нужно это редко, но иногда бывает необходимо.

Получение страничек с другого сервера (LWP)


Проблемы

Закладка на то, что ord() возвращает значения в диапазоне 0..255

Функция ord() также учитывает состояние флага UTF-8 и может вернуть число больше 255.

Возможные источники проблемы

Стандартным примером может стать код, реализующий «escaping URI»:

Решение

Информировать разработчиков о проблеме с целью документирования и/или исправления поведения. Если же необходимо со строкой работать, как с последовательностью байтов, то можно использовать прагму bytes.

Пример

Конкатенация строк с флагом и без флага

Конкатенация строки, имеющей флаг UTF-8, со строкой, у которой этот флаг снят, приводит к автоматическому преобразованию строки без флага. При этом Perl исходит из того, что строка в кодировке «latin-1» или той кодировке, которая установлена с помощью прагмы «encoding».

Решение

Постоянное использование прагмы «encoding» или же тестирование своего и внешнего кода на наличие этой проблемы. Так как первый вариант — это обходной путь и не является в полном смысле решением, то второй вариант более предпочтителен.

Возможные источники проблемы

  • Код, написанный с применением XS: драйвера баз данных, Perl-обертки вокруг библиотек на C.
  • Модули, получающие данные из внешних источников: библиотеки, обрабатывающие данные, пришедшие через CGI интерфейс.

Пример

Обратите внимание, что использование прагмы «utf8» не решает проблемы.

Надежная кодировка Perl с файлом:: Slurp

Мне нужно заменить каждое вхождение http:// на // в файле. Файл может быть (по крайней мере) в UTF-8 , CP1251 или CP1255 .

Илон Маск рекомендует:  Что такое код xml_parser_set_option

Выполняется ли следующее?

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

Этот ответ не сделает вас уверенным, хотя я надеюсь, что он может помочь.

Я не вижу никаких проблем с вашим script (протестирован с помощью utf8 ans iso-8859-1 без проблем), хотя, похоже, существует дискуссия о способности File:: slurp правильно обрабатывать кодировку: http://blogs.perl.org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html

В этом ответе на аналогичную тему автор рекомендует File:: Slurper в качестве альтернативы из-за лучшей обработки кодировки: qaru.site/questions/120311/.

Больше не рекомендуется использовать File:: Slurp (см. здесь).

Я бы рекомендовал использовать Path:: Tiny. Он прост в использовании, работает как с файлами, так и с каталогами, использует только модули ядра и имеет методы slurp/spew специально для uft8 и raw, поэтому у вас не должно быть проблем с кодировкой.

Обновление: Из документации по spew:

Пишет данные в файл атомарно. Файл записывается во временный файл в том же каталоге, а затем переименовывается поверх оригинала. Для передачи опций может использоваться дополнительная хеш-ссылка. Единственный вариант — binmode, который передается binmode() в дескрипторе, используемом для записи.

spew_raw похож на spew с binmode: unix для быстрой, небуферизованной, сырой записи.

spew_utf8 похож на spew с binmode: unix: encoding (UTF-8) (или PerlIO:: utf8_strict). Если установлен Unicode:: UTF8 0.58+, вместо данных, закодированных с помощью Unicode:: UTF8, будет выполняться необработанное spew.

unixforum.org

Форум для пользователей UNIX-подобных систем


  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Кодировка веб страницы на perl

Кодировка веб страницы на perl

Сообщение ripke » 13.04.2010 08:16

Re: Кодировка веб страницы на perl

Сообщение eddy » 13.04.2010 09:02

Re: Кодировка веб страницы на perl

Сообщение ripke » 13.04.2010 09:42

Вообще этот скрипт часть программы openadmin. Остальные скрипты отображают сразу utf-8 нормально, а этот не хочет. Вот его код

Re: Кодировка веб страницы на perl

Сообщение eddy » 13.04.2010 09:59

Re: Кодировка веб страницы на perl

Re: Кодировка веб страницы на perl

Сообщение ripke » 13.04.2010 10:13

Re: Кодировка веб страницы на perl

Сообщение ripke » 13.04.2010 10:22

Re: Кодировка веб страницы на perl

Сообщение eddy » 13.04.2010 10:44

Re: Кодировка веб страницы на perl

Сообщение ripke » 13.04.2010 10:44

И еще вот так на сервере

Серверные переменные и настройки
Переменная Значение сессии / Глобальное значение
auto increment increment 1
auto increment offset 1
automatic sp privileges ON
back log 50
basedir /usr/
binlog cache size 32,768
bulk insert buffer size 8,388,608
character set client utf8
character set connection utf8
character set database utf8
character set filesystem binary
character set results utf8
character set server utf8
character set system utf8
character sets dir /usr/share/mysql/charsets/
collation connection utf8_general_ci
collation database utf8_general_ci
collation server utf8_general_ci
completion type 0

Qp encoding на perl

superreview requested: [Bug 246194] Crash setting character encoding to Unicode (UTF-16) on any random website [@ nsBlockFrame::GetFrameForPointUsing ] : [Attachment 150462] patch
Jungshik Shin has asked David Baron for superreview: Bug 246194: Crash setting character encoding to Unicode (UTF-16) on any random website [@ nsBlockFrame::GetFrameForPointUsing ] http://bugzilla.mozilla.org/show_bug.cgi? > thanks for the prompt r and the analysis that led to the patch. I’ll fix the typos when landing. i asked dbaron for sr on irc. .

superreview granted: [Bug 246194] Crash setting character encoding to Unicode (UTF-16) on any random website [@ nsBlockFrame::GetFrameForPointUsing ] : [Attachment 150462] patch
David Baron has granted Jungshik Shin ‘s request for superreview: Bug 246194: Crash setting character encoding to Unicode (UTF-16) on any random website [@ nsBlockFrame::GetFrameForPointUsing ] http://bugzilla.mozilla.org/show_bug.cgi? >
To unicode or not to unicode
Hi. I have a hard choice on my hands. I’m not actually sure if I should use n data types or normal ones. I need to be able to use several different languages ins >
Unicode strings and encodings
I’m currently going through the various string functions and make them usable for all string encdodings we have. It’s not finished yet, but a lot already works. We have: charsets: binary, ascii, iso-8859-1, unicode encodings: fixed_8, utf8, utf16, ucs2 utf16 is a bit special, as it falls immediately back to ucs2, if there are no surrogates in the string. The default charset is ascii. The default encoding for (binary,ascii,iso-8859-1) is fixed_8 The default encoding for unicode is utf8. String operations with unicode either return utf8 strings (concat utf8, .

Encode Unicode string
Is it possible to encode a unicode string? Every example that I see casts the string to ansi prior to encoding. Doesn’t something get lost when you encode a unicode string when casting as an ansi string? al wrote: > Is it possible to encode a unicode string? Of course, and the RTL provides several ways to do exactly that. TEncoding.GetBytes(), LocaleCharsFromUnicode(), and UnicodeString-to-AnsiString(N) assignments (where N is a specific codepage). > Every example that I see casts the string to ansi prior to encoding. Probably because those examples require ANSI .

doubled Encode.pm: ext\Encode\Encode.pm and lib\Encode.pm
Hello, developers! Currently @15439 I see some surprising situation: Encode.pm has doubled: ext\Encode\Encode.pm lib\Encode.pm moreover, its documentation friends have also doubled: ext\Encode\lib\EncodeFormat.pod ext\Encode\lib\Encode\Details.pod ext\Encode\lib\Encode\Supported.pod ext\Encode\lib\Encode\Encoding.pm lib\EncodeFormat.pod lib\encode\Details.pod lib\encode\Supported.pd lib\encode\Encoding.pm and so have the .enc files: ext\Encode\Encode lib\Encode So I see the following locations have surprising content: lib\Encode ext\Encode ext\Encode\E.

Website that Views other websites?
Does anyone know if there is a website that will allow you to view a certain webpage real time to verify its propogating via the right DNS etc from other points all over the world? Its sort of like Website monitoring I guess, but I cannot find one that does this kind of test. default said in: : > Does anyone know if there is a website that will allow you to view a certain > webpage real time to verify its propogating via the right DNS etc from other > points all over the world? Its sort of like Website monitoring I guess, but &.

Encoding Problems/website problems
Name: Michael Email: mkatphuket-no1dotcom Product: Firefox Summary: Encoding Problems/website problems Comments: Endless problems with firefox,obviously firefox cannot read source code properly.Character Encoding automatic off all the time,as bad as IE7 Browser Details: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 From URL: http://hendrix.mozilla.org/ Note to readers: Hendrix gives no expectation of a response to this feedback but if you wish to provide one you must BCC (not CC) the sender for them to see it. .

Unicode/unicode directories
Hi, any >
Encode your email address on your website
Here’s the code to use. to foil the spammers harvesting robots. abc@defghi.jklmno.pqrstuvwxyz encodes to mailto:%61%62%63%40%64%65%66%67%68%69%2E%6A%6B%6C%6D%6E%6F%2E%70%71%72%73%74%75%76%77%78%79%7A As you can see %61=a %62=b %2E=. %40=@ and so on. so mailto:sam@place.com encodes to sam@place.com From this you can work out yours :-) Mike Finn — _________________________________ http://www.southwest.com.au/

finn In article .

[PATCH] Encode::Encoding
package Encode::MyEncoding; use base qw(Encode::Encoding); __PACKAGE__->Define(qw(myCanonical myAlias)); dies saying: Error: Undefined subroutine &Encode::define_encoding called at . Patch follows after sig. — Tatsuhiko Miyagawa — lib/Encode/Encoding.pm

Sun Apr 28 05:09:05 2002 +++ lib/Encode/Encoding.pm Mon May 6 18:48:59 2002 @@ -3,6 +3,8 @@ use strict; our $VERSION = do < my @r = (q$Revision: 1.29 $ =

/\d+/g); sprintf «%d.».»%02d» x $#r, @r >; +require Encode; + sub Define < .

encode qp a Unicode string
Hello, I have a Unicode string that I would like to convert into quoted- printable encoding, but if I do: #!/usr/bin/perl use utf8; use MIME::QuotedPrint; my $unicode_string = «xxx» # where I have real Unicode string, for example Japanese characters. $encoded = encode_qp($unicode_string); print «qp: $encoded\n»; I get the error message: «Wide character in subroutine entry» If I comment out the «use utf8», I get the right result, but I need it for my script. I tried also to convert the Unicode string to data using the .

[PATCH] Unicode (and other encodings) for %ENV
—————070903030603050005010000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit I wonder if the attached patch would be enough to do Unicode-encoded (and legacy encodings) %ENV values. I basically just hijacked Env.pm and sprinkled a little of Encode magic. The basic assumption is that Perl cannot know which environment variables are in which encoding, the user must specify that. Regarding the other missing Unicode bits listed in perltodo I do think we should still try to do something for Perl 5.10. —————070903030603050005010000 Co.

Encode vs encoding
Hi to all list users. Can someone *please* explain me the difference between (except the scope) encoding and Encode::encode()? I know encoding affects all the code, but what else does it do to do the right thing or am I missing something with Encode? I’m using ActivePerl 5.8.4 build 810 under Windows 2000 and here are the examples: #!/usr/bin/perl -w use strict; my $char = «\xFE»; print ord $char; # prints 254 #!/usr/bin/perl -w use strict; use Encode; my $char = «\xFE»; $char = encode ‘ISO-8859-9’, $char; print ord $char; # prints 6.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL