WriteLn не выводит символы больше #127 (UTF8)

Общие вопросы программирования, алгоритмы и т.п.

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

WriteLn не выводит символы больше #127 (UTF8)

Сообщение fdima1979 » 07.09.2013 16:04:38

Имеется код:
Код: Выделить всё
{$mode objfpc}{$H+}

var   Iter   : LongInt;
   Stop   : LongInt;
begin
   Stop := 1;
   For Iter := 1 To 10000 Do
   begin   
      WriteLn (Iter, '  ', WideChar (Iter));
      Inc (Stop);
      If Stop = 10 Then
      begin
         ReadLn;
         Stop := 1;
      End;
   End;
End.


В линуксойдном lazarus (перенаправив вывод в Memo) он честно выводит все символы, а в FPC WriteLn правильно выводит только первые 128 символов, потом идут знаки вопроса в черном кружке, а с 256го символа идут просто символы знаков вопроса. В принципе, консоль линукса должна понимать UTF8, она ведь выводит текста написанные по русски в UTF8? Не пойму в чем дело.

Несколько месяцев назад у меня вроде получалось ввести на консоль символы вот таким вот образом.

К сведению - У меня консоль настроена на UTF8.
И WriteLn понимает текст написанный UTF8.
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение Ism » 07.09.2013 17:27:58

Модуль должен быть в Utf8 и компилятор настроен на эту кодировку. Чтото из этого не настроено или локаль не Utf8 или вообще шрифт терминала не Unicode , такое бывает в Linux
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение fdima1979 » 07.09.2013 20:31:58

Ism писал(а):Модуль должен быть в Utf8 и компилятор настроен на эту кодировку. Чтото из этого не настроено или локаль не Utf8 или вообще шрифт терминала не Unicode , такое бывает в Linux


Консоль через cat/more выводит на экран файлы написанные в уникоде (русская локаль). FPC тоже выводит эти файлы через StringList и WriteLn. То есть уникодные строки паскаль понимает.

В том то и дело, не понятно что такое. :-((
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение SeZuka » 09.09.2013 07:36:06

Не совсем понятно, что вы хотели получить этим кодом
Код: Выделить всё
   For Iter := 1 To 10000 Do

0-127 получите ASCII символы, а остальные в UTF-8 начинаются с 49280 и до 57279 для двубайтных кодов.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение fdima1979 » 09.09.2013 09:04:31

SeZuka писал(а):Не совсем понятно, что вы хотели получить этим кодом
Код: Выделить всё
   For Iter := 1 To 10000 Do

0-127 получите ASCII символы, а остальные в UTF-8 начинаются с 49280 и до 57279 для двубайтных кодов.

Попробовал перебрать эти коды. Пишет знаки вопроса.

Добавлено спустя 5 минут 29 секунд:
вот новый код:
Код: Выделить всё
{$mode objfpc}{$H+}

var     Iter    : LongInt;
        Stop    : LongInt;
        A       : WideString;
begin
        Stop := 1;
        For Iter := 49280 To 57279 Do
        begin
                WriteLn ('-----');
                WriteLn (Iter, '  ', WideChar (Iter));
                Inc (Stop);
                If Stop = 10 Then
                begin
                        ReadLn;
                        Stop := 1;
                End;
        End;
End.


Добавлено спустя 51 минуту 9 секунд:
А если составить букву из двух однобайтных CHR(x)+ CHR(y), то отображает. Первый байт начинается с цифры 194, а второй идет в диапазоне от 128 до 179. Вот код:

Код: Выделить всё
Var   Ch   : Array[1..2] Of Byte;
   Stop   : Byte;
begin
   Ch[1] := 194;
   Ch[2] := 0;
   Stop := 1;
   While True Do
   begin
      WriteLn (Ch[1], '/', Ch[2], ' = ', Chr (Ch[1]) + Chr(Ch[2]));
      If Ch[2] = 179 Then
      Begin
         Inc (Ch[1]);
         Ch[2] := 128;
      End;
      Inc (Ch[2]);
      Inc (Stop);
      If Stop = 10 Then
      begin
         ReadLn;         
         Stop := 0;
      End;
   End;
End.


Правда там русские буквы в нижнем регистре не все идут по порядку. Возможно некоторые из них находятся в другой части кодировки. А может я что-то напутал.

Эх! Как было хорошо с однобайтовыми кодировками. Все просто и понятно.
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение SeZuka » 09.09.2013 10:11:52

fdima1979 писал(а):Попробовал перебрать эти коды. Пишет знаки вопроса.

Прошу прощения, немного сбил вас с толка, надо было всего-лишь преобразовать к UTF-8:
Код: Выделить всё
   For Iter := 1 To 10000 Do
   begin   
      WriteLn (Iter, '  ', UTF8Encode(WideString(WideChar (Iter))));

WideChar это двубайтный юникодный символ, и его нужно преобразовывать в UTF-8.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: WriteLn не выводит символы больше #127 (UTF8)

Сообщение fdima1979 » 09.09.2013 13:02:14

SeZuka писал(а):
fdima1979 писал(а):Попробовал перебрать эти коды. Пишет знаки вопроса.

Прошу прощения, немного сбил вас с толка, надо было всего-лишь преобразовать к UTF-8:
Код: Выделить всё
   For Iter := 1 To 10000 Do
   begin   
      WriteLn (Iter, '  ', UTF8Encode(WideString(WideChar (Iter))));

WideChar это двубайтный юникодный символ, и его нужно преобразовывать в UTF-8.


УРА! Все, получилось. Спасибо. :-)
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17


Вернуться в Общее

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

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

Рейтинг@Mail.ru