Страница 1 из 1
WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 07.09.2013 16:04:38
fdima1979
Имеется код:
Код: Выделить всё
{$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.
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 07.09.2013 17:27:58
Ism
Модуль должен быть в Utf8 и компилятор настроен на эту кодировку. Чтото из этого не настроено или локаль не Utf8 или вообще шрифт терминала не Unicode , такое бывает в Linux
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 07.09.2013 20:31:58
fdima1979
Ism писал(а):Модуль должен быть в Utf8 и компилятор настроен на эту кодировку. Чтото из этого не настроено или локаль не Utf8 или вообще шрифт терминала не Unicode , такое бывает в Linux
Консоль через cat/more выводит на экран файлы написанные в уникоде (русская локаль). FPC тоже выводит эти файлы через StringList и WriteLn. То есть уникодные строки паскаль понимает.
В том то и дело, не понятно что такое.

(
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 09.09.2013 07:36:06
SeZuka
Не совсем понятно, что вы хотели получить этим кодом
0-127 получите ASCII символы, а остальные в UTF-8 начинаются с 49280 и до 57279 для двубайтных кодов.
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 09.09.2013 10:01:09
fdima1979
SeZuka писал(а):Не совсем понятно, что вы хотели получить этим кодом
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.
Правда там русские буквы в нижнем регистре не все идут по порядку. Возможно некоторые из них находятся в другой части кодировки. А может я что-то напутал.
Эх! Как было хорошо с однобайтовыми кодировками. Все просто и понятно.
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 09.09.2013 10:11:52
SeZuka
fdima1979 писал(а):Попробовал перебрать эти коды. Пишет знаки вопроса.
Прошу прощения, немного сбил вас с толка, надо было всего-лишь преобразовать к UTF-8:
Код: Выделить всё
For Iter := 1 To 10000 Do
begin
WriteLn (Iter, ' ', UTF8Encode(WideString(WideChar (Iter))));
WideChar это двубайтный юникодный символ, и его нужно преобразовывать в UTF-8.
Re: WriteLn не выводит символы больше #127 (UTF8)
Добавлено: 09.09.2013 13:02:14
fdima1979
SeZuka писал(а):fdima1979 писал(а):Попробовал перебрать эти коды. Пишет знаки вопроса.
Прошу прощения, немного сбил вас с толка, надо было всего-лишь преобразовать к UTF-8:
Код: Выделить всё
For Iter := 1 To 10000 Do
begin
WriteLn (Iter, ' ', UTF8Encode(WideString(WideChar (Iter))));
WideChar это двубайтный юникодный символ, и его нужно преобразовывать в UTF-8.
УРА! Все, получилось. Спасибо.
