FPC 3.1.1

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: FPC 3.1.1

Сообщение SSerge » 26.01.2015 07:33:18

Vadim
Код: Выделить всё
program ppppp;
{$mode objfpc}
{$codepage cp1251}
{$H+}

Var s:RawByteString;
    t:TextFile;
    s1:string;

begin
   AssignFile(t,'p.data');
   reset(t);
   readln(t,s);
   CloseFile(t);
   // здесь вывод будет в cp866
   s1:='Строка:';
   writeln('Codepage of s1:',StringCodePage(s1));
   writeln('codepage of  s:',StringCodePage(s));
   writeln(s1,s);
   // вот здесь вывод будет в 1251
   AssignFile(t,'con');
   rewrite(t);
   writeln(t,s1,s);
   closeFile(t);
end.



Добавлено спустя 50 минут 44 секунды:
Мда. Долго думал. Так и не понял, как к этому отнестись.
С одной стороны - подход правильный.
С другой стороны: нпример, файлы данных должны быть не в системной кодировке. И?
использовать грязные хаки типа прямой подмены кодовой страницы в строковых переменных?
где в таком случае, в RTL, наконец AssignFile с аргументами (filevar,filename,codepage)? А нет их.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC 3.1.1

Сообщение kazalex » 26.01.2015 12:05:18

SSerge писал(а):где в таком случае, в RTL, наконец AssignFile с аргументами (filevar,filename,codepage)? А нет их.

А назначение кодовой страницы (например так: TextRec(t).CodePage := cp_utf8) не поможет?

Добавлено спустя 15 минут 48 секунд:
Выяснилось, что правильнее использовать: procedure SetTextCodePage(var T: Text; CodePage: TSystemCodePage);
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.1.1

Сообщение SSerge » 26.01.2015 13:07:54

kazalex писал(а):правильнее использовать: procedure SetTextCodePage(var T: Text; CodePage: TSystemCodePage);


Да, действующий способ. Спасибо за наводку.

Однако:

Код: Выделить всё
   writeln('codePage of console:',GetTextCodePage(output));
   SetTextCodePage(output,0);
   writeln('codePage of console:',GetTextCodePage(output));


вот никогда не угадаешь, что получится. А получается:

codePage of console:866
codePage of console:1251
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC 3.1.1

Сообщение kazalex » 26.01.2015 13:24:24

SSerge писал(а):вот никогда не угадаешь, что получится.

Ты же наверняка видел, что:
Код: Выделить всё
  CP_ACP     = 0;     // default to ANSI code page
  CP_OEMCP   = 1;     // default to OEM (console) code page
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC 3.1.1

Сообщение Vadim » 26.01.2015 14:51:33

SSerge
Если просто выводить на экран, то умолчальная перекодировка как в системе - дело правильное. А вот если текст на экран не выводится, а просто идёт конвейер обработки текста, что-то типа ls ./* | grep, то неправильное. :-)
kazalex
Спасибо за подсказку. Что то я про SetTextCodePage() не подумал. Так кошерно. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2

Рейтинг@Mail.ru