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

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

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

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

Сообщение fdima1979 » 07.09.2013 15:19:47

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

var   Iter   : LongInt;
   Stop   : LongInt;
   A   : String;
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)

Сообщение Сквозняк » 08.09.2013 19:32:50

fdima1979 писал(а):а в FPC WriteLn правильно выводит только первые 128 символов, потом идут знаки вопроса в черном кружке, а с 256го символа идут просто символы знаков вопроса

Writeln нормально выводит символы консоль. Дело в то что символы 128..255 в utf-8 записываются не одним а двумя-тремя символами и если процедуре writeln скормить массив таких символов то ты увидишь в консоли нужную тебе букву. Вот пример для кода в IBM 866 кодировки которая поддерживается пропатченным редактором fp
Код: Выделить всё
VAR
Q3: BYTE;


FUNCTION CP866__UTF8(Z3: BYTE): STRING;//ПРЕОБРАЗОВАНИЕ СИМВОЛА CP866 В СТРОКУ UTF8
BEGIN
CASE Z3 OF
0..127: CP866__UTF8:=CHR(Z3);
128: CP866__UTF8:=#208#144;
129: CP866__UTF8:=#208#145;
130: CP866__UTF8:=#208#146;
131: CP866__UTF8:=#208#147;
132: CP866__UTF8:=#208#148;
133: CP866__UTF8:=#208#149;
134: CP866__UTF8:=#208#150;
135: CP866__UTF8:=#208#151;
136: CP866__UTF8:=#208#152;
137: CP866__UTF8:=#208#153;
138: CP866__UTF8:=#208#154;
139: CP866__UTF8:=#208#155;
140: CP866__UTF8:=#208#156;
141: CP866__UTF8:=#208#157;
142: CP866__UTF8:=#208#158;
143: CP866__UTF8:=#208#159;
144: CP866__UTF8:=#208#160;
145: CP866__UTF8:=#208#161;
146: CP866__UTF8:=#208#162;
147: CP866__UTF8:=#208#163;
148: CP866__UTF8:=#208#164;
149: CP866__UTF8:=#208#165;
150: CP866__UTF8:=#208#166;
151: CP866__UTF8:=#208#167;
152: CP866__UTF8:=#208#168;
153: CP866__UTF8:=#208#169;
154: CP866__UTF8:=#208#170;
155: CP866__UTF8:=#208#171;
156: CP866__UTF8:=#208#172;
157: CP866__UTF8:=#208#173;
158: CP866__UTF8:=#208#174;
159: CP866__UTF8:=#208#175;
160: CP866__UTF8:=#208#176;
161: CP866__UTF8:=#208#177;
162: CP866__UTF8:=#208#178;
163: CP866__UTF8:=#208#179;
164: CP866__UTF8:=#208#180;
165: CP866__UTF8:=#208#181;
166: CP866__UTF8:=#208#182;
167: CP866__UTF8:=#208#183;
168: CP866__UTF8:=#208#184;
169: CP866__UTF8:=#208#185;
170: CP866__UTF8:=#208#186;
171: CP866__UTF8:=#208#187;
172: CP866__UTF8:=#208#188;
173: CP866__UTF8:=#208#189;
174: CP866__UTF8:=#208#190;
175: CP866__UTF8:=#208#191;
176: CP866__UTF8:=#226#150#145;
177: CP866__UTF8:=#226#150#146;
178: CP866__UTF8:=#226#150#147;
179: CP866__UTF8:=#226#148#130;
180: CP866__UTF8:=#226#148#164;
181: CP866__UTF8:=#226#149#161;
182: CP866__UTF8:=#226#149#162;
183: CP866__UTF8:=#226#149#150;
184: CP866__UTF8:=#226#149#149;
185: CP866__UTF8:=#226#149#163;
186: CP866__UTF8:=#226#149#145;
187: CP866__UTF8:=#226#149#151;
188: CP866__UTF8:=#226#149#157;
189: CP866__UTF8:=#226#149#156;
190: CP866__UTF8:=#226#149#155;
191: CP866__UTF8:=#226#148#144;
192: CP866__UTF8:=#226#148#148;
193: CP866__UTF8:=#226#148#180;
194: CP866__UTF8:=#226#148#172;
195: CP866__UTF8:=#226#148#156;
196: CP866__UTF8:=#226#148#128;
197: CP866__UTF8:=#226#148#188;
198: CP866__UTF8:=#226#149#158;
199: CP866__UTF8:=#226#149#159;
200: CP866__UTF8:=#226#149#154;
201: CP866__UTF8:=#226#149#148;
202: CP866__UTF8:=#226#149#169;
203: CP866__UTF8:=#226#149#166;
204: CP866__UTF8:=#226#149#160;
205: CP866__UTF8:=#226#149#144;
206: CP866__UTF8:=#226#149#172;
207: CP866__UTF8:=#226#149#167;
208: CP866__UTF8:=#226#149#168;
209: CP866__UTF8:=#226#149#164;
210: CP866__UTF8:=#226#149#165;
211: CP866__UTF8:=#226#149#153;
212: CP866__UTF8:=#226#149#152;
213: CP866__UTF8:=#226#149#146;
214: CP866__UTF8:=#226#149#147;
215: CP866__UTF8:=#226#149#171;
216: CP866__UTF8:=#226#149#170;
217: CP866__UTF8:=#226#148#152;
218: CP866__UTF8:=#226#148#140;
219: CP866__UTF8:=#226#150#136;
220: CP866__UTF8:=#226#150#132;
221: CP866__UTF8:=#226#150#140;
222: CP866__UTF8:=#226#150#144;
223: CP866__UTF8:=#226#150#128;
224: CP866__UTF8:=#209#128;
225: CP866__UTF8:=#209#129;
226: CP866__UTF8:=#209#130;
227: CP866__UTF8:=#209#131;
228: CP866__UTF8:=#209#132;
229: CP866__UTF8:=#209#133;
230: CP866__UTF8:=#209#134;
231: CP866__UTF8:=#209#135;
232: CP866__UTF8:=#209#136;
233: CP866__UTF8:=#209#137;
234: CP866__UTF8:=#209#138;
235: CP866__UTF8:=#209#139;
236: CP866__UTF8:=#209#140;
237: CP866__UTF8:=#209#141;
238: CP866__UTF8:=#209#142;
239: CP866__UTF8:=#209#143;
240: CP866__UTF8:=#208#129;
241: CP866__UTF8:=#209#145;
242: CP866__UTF8:=#208#132;
243: CP866__UTF8:=#209#148;
244: CP866__UTF8:=#208#135;
245: CP866__UTF8:=#209#151;
246: CP866__UTF8:=#208#142;
247: CP866__UTF8:=#209#158;
248: CP866__UTF8:=#194#176;
249: CP866__UTF8:=#226#136#153;
250: CP866__UTF8:=#194#183#153;
251: CP866__UTF8:=#226#136#154;
252: CP866__UTF8:=#226#132#150;
253: CP866__UTF8:=#194#164#150;
254: CP866__UTF8:=#226#150#160;
255: CP866__UTF8:=#194#160;
END;
END;


BEGIN
FOR Q3:=0 TO 255 DO WRITELN(CP866__UTF8(Q3));
END.


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

Тогда в коде и консоли были одинаковые кодировки. А если они разные, то текст запихиваемый во writeln нужно конвертировать в кодировку консоли, примерно как в примере выше. Очевидно что в твоём примере функция WideChar не справляется с конвертированием чисел >127 в массив символов.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32


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

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

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

Рейтинг@Mail.ru