Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

UTF-8 CP866

4 views
Skip to first unread message

Mikhail Stakhanov

unread,
Apr 3, 2019, 6:19:58 PM4/3/19
to
Здравствуйте, All!

Слушайте а как вы кодите ?
вот я писал сегодня прогу в винде в фаре, потом перенес ее на linux и там
отстроил, так у меня
usage и системные сообщения UTF-8
А все для внутренних фидо файлов CP866, ну подправил я 1 раз. а как дальше,
перенес работающую версию в винду и не вижу всего utf-8.
Я не програмист, просто так увлечение, как вообще этот вопрос правильно
решается ?


Всего наилучшего, Mikhail

Eugene Grosbein

unread,
Apr 4, 2019, 6:14:58 AM4/4/19
to
03 апр. 2019, среда, в 22:46 NOVT, Mikhail Stakhanov написал(а):

MS> Слушайте а как вы кодите ?
MS> вот я писал сегодня прогу в винде в фаре, потом перенес ее на linux и там
MS> отстроил, так у меня
MS> usage и системные сообщения UTF-8
MS> А все для внутренних фидо файлов CP866, ну подправил я 1 раз. а как
MS> дальше,
MS> перенес работающую версию в винду и не вижу всего utf-8.
MS> Я не програмист, просто так увлечение, как вообще этот вопрос правильно
MS> решается ?

Кодировка самого текста perl-кода, вообще говоря, имеет слабое отношение
к кодировке строковых данных, которые этот код обрабатывает,
так как perl в любом случае конвертирует строковые данные в своё
внутренне представление из "внешней" кодировки, будь это CP866 или CP1251
или UTF-8, ему лишь нужно правильно эту кодировку задать - в том случае,
когда кодировка вообще имеет значение - для чисто латинницы (ASCII) не имеет.

А текст кода пиши в той кодировке, какая тебе удобней, даже в UTF-8,
благо нынче полно редакторов, умеющих редактировать UTF-8 напрямую,
включая FAR-овский. Я лично пишу perl-скрипты в KOI8-R :-)

Если выберешь не 8-битную кодировку для исходников, а UTF-8,
то не забудь добавить use utf8 в начало, чтобы транслятор perl
правильно переводил символы UTF-8 из текста кода во внутренне перловское
представление во время трансляции исходника как в таких случаях:

die "Системная ошибка ..."

Eugene
--
Choose no career

Alexey Vissarionov

unread,
Apr 4, 2019, 11:44:59 AM4/4/19
to
Доброго времени суток, Mikhail!
04 Apr 2019 00:46:04, ты -> All:

MS> Слушайте а как вы кодите ?
MS> вот я писал сегодня прогу в винде в фаре, потом перенес ее на linux и
MS> там отстроил, так у меня usage и системные сообщения UTF-8 А все для
MS> внутренних фидо файлов CP866

use Encode;


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Облачных технологий не существует - существуют только чужие компутеры

Mikhail Stakhanov

unread,
Apr 5, 2019, 1:34:59 AM4/5/19
to
Здравствуйте, Alexey!

Ответ на сообщение Alexey Vissarionov (2:5020/545) к Mikhail Stakhanov,
написанное 04 апр 19 в 18:36:
MS>> Слушайте а как вы кодите ?
MS>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на
MS>> linux и там отстроил, так у меня usage и системные сообщения
MS>> UTF-8 А все для внутренних фидо файлов CP866

AV> use Encode;
from_to у меня не работает.... не понимаю почему.

Всего наилучшего, Mikhail

Eugene Grosbein

unread,
Apr 5, 2019, 4:49:59 AM4/5/19
to
05 апр. 2019, пятница, в 05:37 NOVT, Mikhail Stakhanov написал(а):

MS> Ответ на сообщение Alexey Vissarionov (2:5020/545) к Mikhail
MS> Stakhanov,
MS> написанное 04 апр 19 в 18:36:
MS>>> Слушайте а как вы кодите ?
MS>>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на
MS>>> linux и там отстроил, так у меня usage и системные сообщения
MS>>> UTF-8 А все для внутренних фидо файлов CP866
AV>> use Encode;
MS> from_to у меня не работает.... не понимаю почему.

А внимательно читал доку на Encode?

from_to требует 1) переменной, а не константной строки, 2) переменной
с данными во внешней кодировке, а не внутреннем перловском представлении,
то есть нельзя в качестве теста тупо присвоить переменной строковую
константу и попытаться её перекодировать через from_to, если текст
скрипта в utf-8, а константа не чисто латинница, которая перед
стартом кода неявно транслируется во внутреннее представление.

А ты для чего конкретно пытаешься применить from_to?
Эта функция редко бывает полезна на самом деле, потому что чаще всего
perl все данные конвертирует во внутреннее представление при обычном
файловом вводе-выводе автоматически, а для таких переменных
нужно использовать encode() вместо from_to().

Eugene

Gennadij Pastuhov

unread,
Apr 5, 2019, 5:29:59 AM4/5/19
to
Рад всех приветствовать! А особенно - Mikhail!

Пятница апреля 05 19 07:37 Mikhail Stakhanov писал к Alexey Vissarionov:

MS>>> Слушайте а как вы кодите ?
MS>>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на
MS>>> linux и там отстроил, так у меня usage и системные сообщения
MS>>> UTF-8 А все для внутренних фидо файлов CP866
AV>> use Encode;
MS> from_to у меня не работает.... не понимаю почему.

На хабре есть отличная статья по этой теме. Краткая выжимка:
use utf8; - эта прагма позволяет писать текст программы в utf8, к данным
программы она отношения не имеет

Когда читаешь фидошные файлы, то применяй что-то вроде
Encode::decode($charset, $file_content);
- это перевод данных, хранящихся в переменной $file_content, из кодировки
$charset во внутреннее перловое представление (не utf8!)

При выводе надо делать обратно:
Encode::encode($fido_charset, $text);

Т.е., текст программы, данные внутри программы и данные во внешних файлах - 3
разные сущности, нужно не путать их.

... Jonny wanna live

Mikhail Stakhanov

unread,
Apr 5, 2019, 5:19:59 PM4/5/19
to
Здравствуйте, Eugene!

Ответ на сообщение Eugene Grosbein (2:5006/1) к Mikhail Stakhanov,
написанное 05 апр 19 в 16:38:

EG> 05 апр. 2019, пятница, в 05:37 NOVT, Mikhail Stakhanov написал(а):

MS>> Ответ на сообщение Alexey Vissarionov (2:5020/545) к Mikhail
MS>> Stakhanov, написанное 04 апр 19 в 18:36:
MS>>>> Слушайте а как вы кодите ?
MS>>>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на
MS>>>> linux и там отстроил, так у меня usage и системные сообщения
MS>>>> UTF-8 А все для внутренних фидо файлов CP866
AV>>> use Encode;
MS>> from_to у меня не работает.... не понимаю почему.

EG> А внимательно читал доку на Encode?

EG> from_to требует 1) переменной, а не константной строки, 2) переменной
EG> с данными во внешней кодировке, а не внутреннем перловском
EG> представлении, то есть нельзя в качестве теста тупо присвоить
EG> переменной строковую константу и попытаться её перекодировать через
EG> from_to, если текст скрипта в utf-8, а константа не чисто латинница,
EG> которая перед стартом кода неявно транслируется во внутреннее
EG> представление.

EG> А ты для чего конкретно пытаешься применить from_to?
EG> Эта функция редко бывает полезна на самом деле, потому что чаще всего
EG> perl все данные конвертирует во внутреннее представление при обычном
EG> файловом вводе-выводе автоматически, а для таких переменных
EG> нужно использовать encode() вместо from_to().

use strict;
use warnings;
use Encode qw(decode encode);
use utf8;
opendir(DIR, "d:\\") or die "can't open $!";
my @files = grep !/^\.\.?$/, readdir DIR;
close DIR;
print join ("\n",@files);

foreach my $tmp (@files) {$tmp=decode("cp1251",$tmp)};
print join ("-----\n",@files);

foreach my $tmp (@files) {$tmp=encode("utf8",$tmp)}; <- это уже не нужно так
как use utf8! (но понятно как это работает теперь! Спасибо!

print join ("111 \n",@files);

Всего наилучшего, Mikhail

Mikhail Stakhanov

unread,
Apr 5, 2019, 5:19:59 PM4/5/19
to
Здравствуйте, Gennadij!

Ответ на сообщение Gennadij Pastuhov (2:5036/26) к Mikhail Stakhanov,
написанное 05 апр 19 в 12:10:
GP> На хабре есть отличная статья по этой теме. Краткая выжимка:
GP> use utf8; - эта прагма позволяет писать текст программы в utf8, к
GP> данным программы она отношения не имеет

GP> Когда читаешь фидошные файлы, то применяй что-то вроде
GP> Encode::decode($charset, $file_content);
GP> - это перевод данных, хранящихся в переменной $file_content, из
GP> кодировки $charset во внутреннее перловое представление (не utf8!)

GP> При выводе надо делать обратно:
GP> Encode::encode($fido_charset, $text);

Да вкурил. спасибо работает. у меня вчера не работало, так как я неправильно
все понял!
Просто хочется писать универсальный код (я пишу srif процессор для qico), когда
есть время, и хочется чтобы и в винде работало. а тут cp1251 кодировка файлов.
Кстати! про построение индекса:
В Vireq это сделано так:
Ищем все каталоги и создаем dirs.lst формата:
dir number
далее открываем его для чтения:
считываем в %files = {file = > dir_number, дата_создания}
сортируем %files и записываем его по буквам в файлы [a-z][0-9][...] все
символы, так вот вопрос!
в ftsc нету описания а как быть с русскими буквами ?

Я решу этот вопрос записывая название файла в кавычки:
"имя файла с пробелами" цифра(номер каталога) системное время (чтобы сравнивать
по новизне если нужен новыйший файл по маске)
может есть идеи как хранить индекс по-другому ?
qico я допилю чтобы он в qflg.* обрабатывал ковычки при отдаче.
там будет вопрос еще системный, а если в индексе будет подмаунченый каталог
ntfs с cp1251 ?

Всего наилучшего, Mikhail

Eugene Grosbein

unread,
Apr 5, 2019, 9:44:58 PM4/5/19
to
05 апр. 2019, пятница, в 21:15 NOVT, Mikhail Stakhanov написал(а):

MS> может есть идеи как хранить индекс по-другому ?

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

MS> там будет вопрос еще системный, а если в индексе будет подмаунченый
MS> каталог
MS> ntfs с cp1251 ?

Если в исходных данных нет однозначности в кодировке в виде метаданных
каких-нибудь (типа mime-type или ещё как) и выбор стоит между utf-8
и однобайтной кодировкой 1251, я обычно делаю так:

use Encode;

# в $_ исходные данные во внешней кодировке
$tmp = $_;
# конвертируем во внутреннее представление
$_ = utf8::decode($tmp) ? $tmp : Encode::decode('windows-1251', $_,
Encode::FB_PERLQQ);
# конвертируем из внутреннего представления в UTF-8

utf8::encode($_);

При этом use utf8 использовать необязательно.

Как это работает: делаем копию строки и пытаемся её перевести из UTF-8 в
перловское внутреннее представление функцией utf8::decode($tmp), которая
преобразует свой аргумент и возвращает логическую истину, если
преобразование удалось, то есть если исходные данные действительно были
корректным UTF-8, и тогда мы замещаем $_ полученным внутренним
представлением и можем работать с ней как с перловой строкой.

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

Затем utf8::encode($_) преобразует в UTF-8, если надо.

Eugene

Mikhail Stakhanov

unread,
Apr 6, 2019, 7:39:58 PM4/6/19
to
Здравствуйте, Eugene!

Ответ на сообщение Eugene Grosbein (2:5006/1) к Mikhail Stakhanov,
написанное 06 апр 19 в 09:26:
Огромное спасибо! Вопрос снят!

Всего наилучшего, Mikhail

Brother Rabbit

unread,
Apr 9, 2019, 3:09:58 AM4/9/19
to
Hi, Mikhail!

05 апр 19 07:37, Mikhail Stakhanov -> Alexey Vissarionov:

MS>>> Слушайте а как вы кодите ?
MS>>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на
MS>>> linux и там отстроил, так у меня usage и системные сообщения
MS>>> UTF-8 А все для внутренних фидо файлов CP866

AV>> use Encode;

MS> from_to у меня не работает.... не понимаю почему.

encode пробовал?

Have nice nights.
Brother Rabbit.

0 new messages