В windows испорчен writeln

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

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

Re: В windows испорчен writeln

Сообщение Сквозняк » 14.10.2019 11:16:52

Снег Север писал(а):
Сквозняк писал(а): Если путаются, то это баг.

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

Вот врать не надо. Паскаль писался ещё для компов с перфокартами, после для компов на магнитных лентах, а уже только потом для доса, который ни разу не винда. Какая винда ставилась с перфокарт, напомни? 3.11 поставлялась на коробке с дискетами. А в мешке с перфокартами - какая? Может десятка? Ты и в другой теме грудью вставал на защиту вранья, устройство у тебя такое. Читай, просвещайся:
Изображение
Изображение
Изображение
К. Боон "Паскаль для всех", страницы 24 и 25.

Добавлено спустя 3 минуты 3 секунды:
Особенно внимательно прочитай про то, что нельзя вносить путаницу.
Сквозняк
энтузиаст
 
Сообщения: 705
Зарегистрирован: 29.06.2006 22:08:32

Re: В windows испорчен writeln

Сообщение Снег Север » 14.10.2019 11:42:12

Для особо внимательных, там написано: "Каждая версия языка Паскаль имеет свою особенность при вводе данных". Так что - обтекай.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2264
Зарегистрирован: 27.11.2007 16:14:47

Re: В windows испорчен writeln

Сообщение Сквозняк » 14.10.2019 23:20:18

Ты же обосрался, ты и обтекай. Наша версия древнее, а в твоей - тянут совместимость с глюками дельфей и устраивают цирк с конями на ровном месте.
Сквозняк
энтузиаст
 
Сообщения: 705
Зарегистрирован: 29.06.2006 22:08:32

Re: В windows испорчен writeln

Сообщение Снег Север » 15.10.2019 07:51:20

Да, это уже не лечится...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2264
Зарегистрирован: 27.11.2007 16:14:47

Re: В windows испорчен writeln

Сообщение Сквозняк » 15.10.2019 09:58:25

Чтобы в винде writeln не перекодировал строки из utf-8 надо использовать такую пилюлю:
Код: Выделить всё
defaultsystemcodepage:=866;   //CP_NONE валит форму
setconsolecp(866);
SetConsoleOutputCP(866);


Добавлено спустя 1 минуту 17 секунд:
Снег Север писал(а):Да, это уже не лечится...

Вот-вот, возьми клизму ведровую, может облегчит твои страдания. Носишься с запором по форуму и ничто тебе не помогает...
Сквозняк
энтузиаст
 
Сообщения: 705
Зарегистрирован: 29.06.2006 22:08:32

Re: В windows испорчен writeln

Сообщение Cheb » 21.10.2019 14:11:44

Я сколько себя помню использую следующий костыль

Код: Выделить всё
WriteLn(TrimRight(WideToConsole(U))); //где U: UnicodeString

...

{$if FPC_FULLVERSION>=20700}
  {$push}
  {$warn IMPLICIT_STRING_CAST off}
  {$warn IMPLICIT_STRING_CAST_LOSS off}
  {$warn EXPLICIT_STRING_CAST off}
  {$warn EXPLICIT_STRING_CAST_LOSS off}
   function WideToConsole(u: UnicodeString): RawByteString;
   begin
     Result:= u;
   end;     
  {$pop}
{$else} 
   function WideToConsole(u: UnicodeString): AnsiString;
   {$ifndef unix}
   var
     i: integer;
     b: longbool;
     c: ansichar;
   {$endif}
   begin
     {$ifdef unix} //utf-8 assumed
      Result:= Utf8Encode(u);
     {$else}
      if u='' then Result:=''
      else begin
        i:=WideCharToMultiByte(GetConsoleOutputCP(), WC_COMPOSITECHECK or WC_DISCARDNS, @u[1], length(u), nil, 0, nil, nil);
        SetLength(Result, i);
        b:=True;
        c:='?';
        WideCharToMultiByte(GetConsoleOutputCP(), WC_COMPOSITECHECK or WC_DISCARDNS, @u[1], length(u), @Result[1], i, @c, @b);
      end;
     {$endif}
   end;
{$endif} 

Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 763
Зарегистрирован: 06.06.2005 15:54:34

Re: В windows испорчен writeln

Сообщение Alex2013 » 22.10.2019 13:54:29

Блин ! Какие перфокарты! Первые массово доступные версии паскаля появились уже на 8-разрядых персоналках c CP/M.
Например я в первый раз увидел паскаль ( Turbo Pascal версий с первой по третью ) на Ямахе MSX в мохнатом то ли 1986 то ли 1987 году (в школьном кружке ). Кстати в те времена турбо паскаль смотрелся куда бледнее роскошного MSX Бейсика (который на Ямахе был чуть-ли не языком системного программирования ) .

А что до "консоли по вызову" то раньше работал вот такой хак ...

Код: Выделить всё
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, windows,LazUTF8;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
AllocConsole;
   try
    IsConsole := True;
    SysInitStdIO;
      Writeln(UTF8ToConsole('123 нажмите ентер'));
      Readln;
   finally
    FreeConsole;
   end;
end;

Сейчас открывает консоль и ... "молчит как партизан" ... :roll:
Интересно в чем дело ? :roll:
Добавлял эту строку ...
system.Assign(output,'CONOUT$'); system.ReWrite(output);
..результат тот же !
...
ЗЫ
Хм вроде заработало причем без system.Assign(output,'CONOUT$'); system.ReWrite(output);
Просто запустил не из под Лазаруса ... :idea:
Зы Зы
..для фасона можно добавит цвет ..
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
Но есть ограничение ! Попытка вызвать повторное открытие закрытой консоли вызывает ошибку .
Alex2013
долгожитель
 
Сообщения: 1595
Зарегистрирован: 03.04.2013 11:59:44

Re: В windows испорчен writeln

Сообщение Сквозняк » 25.10.2019 13:20:52

32 битный FPC в лазарусе собран без переменной defaultsystemcodepage и нужно тестировать чем её заменить. Придумали развлечение.

Добавлено спустя 15 часов 9 минут 7 секунд:
По ходу, чтобы у win32 приложений консольный текст не перекодировался, пилюля должна иметь вид
Код: Выделить всё
{$IFDEF WINDOWS}
{$IFDEF WIN64}
defaultsystemcodepage:=866;
SetConsoleOutputCP(866);
{$ENDIF WIN64}
setconsolecp(866);
{$ENDIF WINDOWS}
Сквозняк
энтузиаст
 
Сообщения: 705
Зарегистрирован: 29.06.2006 22:08:32

Пред.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru