Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Вывод текста в консольном приложении   Найти похожие ветки 

 
BJValentine   (2005-08-15 13:14) [0]

Как вывести русский текст на консоль чтобы он выглядел нормально, а не абракадаброй? Спасибо.


 
alex_***   (2005-08-15 13:35) [1]

OemToChar или CharToOem


 
BJValentine   (2005-08-15 14:08) [2]

А так чтобы не использовать эти фунуции, там не знаю, ну ключ какой-то во WriteLn есть?


 
alex_***   (2005-08-15 14:10) [3]

есть секреная комбинация клавиш.... вышлю за 5$


 
GLFox ©   (2005-08-15 14:11) [4]

Смотри функцию SetConsoleOutputCP


 
GLFox ©   (2005-08-15 14:17) [5]

А чтобы работало не только под Win NT, то ситуацию надо изменить в свою пользу.
Известно, что Write/WriteLn без указания файла осуществляет вывод в файл Output. Output имеет тип TextFile, он же TTextRec, содержимое которого описано в SysUtils.pas. Есть там и поля, содержащие адреса процедур, в которые приходит на обработку поток выводимых приложением данных (в случае вывода). Не вдаваясь в подробности (посмотреть устройство механизмов вывода можно в исходниках RTL), посмотрим, что происходит в процедуре,
отвечающей за вывод (TTextRec.InOutFunc):
{ Реконструкция TextOut из Assign.asm }
function TextOut(var Text: TTextRec): Integer;
var
 Dummy: Cardinal;
 SavePos: Integer;
begin
 SavePos := Text.BufPos;
 if SavePos > 0 then begin
   Text.BufPos := 0;
   if WriteFile(Text.Handle, Text.BufPtr^, SavePos, Dummy, nil) then
     Result := 0
   else Result := GetLastError;
 end else Result := 0;
end;

Теперь видно, что нужно сделать для вывода символов в нужной кодовой таблице - перед выводом в файл средствами ОС модифицировать данные в выходном буфере структуры Text, вписав следующую строку:
CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos);
Модифицировать буфер можно, т.к. после операции записи в файл содержимое буфера фактически сбрасывается (когда в Text.BufPos записывается 0 - именно столько актуальных данных остается в буфере). Если не завязываться на эту особенность реализации, можно распределить буфер и модифицировать данные уже в нем. Впрочем, решение в любом случае достаточно сильно опирается на
особенности реализации, поэтому проверить его пригодность при смене версии Delphi рекомендуется в любом случае. С другой стороны, вероятность отхода Borland от наработанного решения крайне мала.

Эту инфу я нашел где-то, по-моему, в статье Евгения Каснерика.
P.S. STFW


 
Leonid Troyanovsky ©   (2005-08-15 14:28) [6]


> GLFox ©   (15.08.05 14:17) [5]

> CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos);


Зачем все эти приседания:


 CharToOem(Pointer(s), Pointer(s));
 writeln(s);


--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.011 c
3-1122290285
Layner
2005-07-25 15:18
2005.09.04
FIREBIRD / COLLATE PXW_CYRL


10-1100540687
Cheburek
2004-11-15 20:44
2005.09.04
Правильно передать IStream из DCOM-клиента на DCOM-сервер ?


4-1121752041
chameleon
2005-07-19 09:47
2005.09.04
Почему не для всех структур нужно указывать размер ?


14-1123411063
Gamer
2005-08-07 14:37
2005.09.04
Трудности перевода


14-1123364372
SoftX
2005-08-07 01:39
2005.09.04
Сожрал семь пачек Ноотропила. Когда стану умным?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский