Поддержка русского языка

Форум для изучающих FPC и их учителей.

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

AnnaNsk
незнакомец
Сообщения: 5
Зарегистрирован: 08.11.2015 08:00:41

Поддержка русского языка

Сообщение AnnaNsk »

Добрый день!
Подскажите, установлен FPC 2.6.4 при написании программы в операторе writeln используем русский текст. (writeln('Привет'))
В консольном окне русский не отображается, а всякие "крякозябры". (смотри вложение)
Как это обойти? Надо, чтобы поддерживался вывод русских букв.
Спасибо.
Вложения
123.JPG
123.JPG (10.72 КБ) 34235 просмотров
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Сообщение Zhbr »

Какая ОС?
В данном модуле есть процедуры конвертации строк, попробуй http://freepascal.org/docs-html/rtl/system/index-5.html
AnnaNsk
незнакомец
Сообщения: 5
Зарегистрирован: 08.11.2015 08:00:41

Сообщение AnnaNsk »

Win8
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

AnnaNsk писал(а):Win8

Код: Выделить всё

writeln( UTF8ToSys( 'Привет!' ) ); // попробуйте, и будет Вам счастье, скорее всего.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

AnnaNsk
А в чём Вы исходный код программы пишете?
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

В windows 7 в консольных приложениях использую

Код: Выделить всё

writeln(utf8toconsole('Приветик'));
Так как кодировка консоли по умолчанию 866.
AnnaNsk
незнакомец
Сообщения: 5
Зарегистрирован: 08.11.2015 08:00:41

Сообщение AnnaNsk »

А в чём Вы исходный код программы пишете?
Может, не совсем поняла вопрос. На Pascal. Использую IDE FreePascal. Вы это имели ввиду?
writeln( UTF8ToSys( 'Привет!' ) ); // попробуйте, и будет Вам счастье, скорее всего. writeln(utf8toconsole('Приветик'));
при компиляции выдается следующая ошибка

Добавлено спустя 55 секунд:
Ошибка во вложении
Вложения
122.JPG
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

попробуй так:

Код: Выделить всё

uses Windows;
begin
   SetConsoleOutputCP(1251);
   writeln('Привет!');
   writeln('Ответ: ',2+2);
end.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

gvido писал(а):Так как кодировка консоли по умолчанию 866.


Ага, если не учитывать, что текстовое IDE в принципе не работает с кодировкой UTF-8, тем более под windows... то тоже себе метод.

vitaly_l
см. 1) примечание выше 2) функция lazarus, недоступная без прямого подключения соответствующего unit.

ЗЫ: я могу сказать, как будет идеологически правильно, но компилятор должен быть 2.7.х - 3.х, в ранних это не поддерживается

Кстати, метод уважаемого Скалогрыза в предыдущем посте вполне работоспособен.
AnnaNsk
незнакомец
Сообщения: 5
Зарегистрирован: 08.11.2015 08:00:41

Сообщение AnnaNsk »

Методе скалогрыза привел вот к чему:

Добавлено спустя 16 минут 53 секунды:
Компилятор вот такой

Добавлено спустя 1 минуту 1 секунду:
Lazarus у нас нет
Вложения
113.JPG
111.JPG
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

AnnaNsk писал(а):Методе скалогрыза привел вот к чему:

какая жесть!

а если вот так попробовать:

Код: Выделить всё

uses Windows;
begin
   SetConsoleOutputCP(1251);
   writeln('Привет!');
   writeln('Ответ: ',2+2);
   SetConsoleOutputCP(866);
end.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

скалогрыз писал(а):какая жесть!


Там, возможно, для консоли подгружен несистемный русификатор, нечто вроде kb.com/rk.com или другой такой же кривой. В этом случае при смене видеорежимов, кодовой страницы и пр., windows переписывает его знакогенератор и получается продемонстрированная хрень. Любят этот rk криворукие одмины! :mrgreen: Хотя, уже во времена DOS он был одним из самых кривых.

Добавлено спустя 12 минут 23 секунды:
AnnaNsk
Вот это, пожалуйста, запустите:

Код: Выделить всё

program my_program;

uses Windows;
     var s:string;
         i,c:integer;
         cp:integer;
begin
   cp:=GetConsoleOutputCp;
   writeln('Current code page=',cp);
   SetConsoleOutputCP(1251);
   writeln('Current code page=',GetConsoleOutputCp);
   s:='Привет!';
   writeln(s);
   for i:=1 to length(s) do
     write(ord(s[i]):8);
   writeln;
   writeln('Ответ: ',2+2);
   SetConsoleOutputCP(cp);
   writeln('Current code page=',GetConsoleOutputCp);
end.



при правильном отрабатывании должная вывести следующее (если исходник в cp1251):

Код: Выделить всё

C:\>my_program.exe
Current code page=866
Current code page=1251
Привет!
     207     240     232     226     229     242      33
Ответ: 4
Current code page=866
AnnaNsk
незнакомец
Сообщения: 5
Зарегистрирован: 08.11.2015 08:00:41

Сообщение AnnaNsk »

ЧТо-то ничего не вышло((( Ужас какой-то.
Да и трудно будет детям объяснить как сделать, чтобы русский пошёл (особенно на первых уроках. Тем кто еще не знает про программирования.). Придеьтся опять использовать ABCPascal. А другим, кто захочет Free использовать рекомендовать писать на латинице.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

AnnaNsk
Вы мой код запускали? Что он вывел?
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

AnnaNsk, исходник в какой кодировке? Если приложение запускается в среде windows xp - Windows 7, то русский нужно приводить к кодировке 866.
Менять кодовую страницу консоли в сеансе приложения - тоже вариант. Но лучше перекодировать, как извратный вариант - сменить кодировку исходника.
Ответить