Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2014, 19:11
dnwest dnwest вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 12
Репутация: 10
По умолчанию AnsiToOem

Пытаюсь сохранять TStringList в текстовый файл ASCII с корректным отображением кириллицы.
Код:
procedure TForm2.Button1Click(Sender: TObject);
function AnsiToOem(AStr : String) : String;
  begin
    SetLength(Result, Length(AStr));
    //CharToOemBuff(PChar(AStr), PAnsiChar(Result), Length(AStr));
    CharToOem(PChar(AStr), PAnsiChar(Result));
  end;
var
  str: TStringList;
begin
  str := TStringList.Create;
  str.Add(AnsiToOem('ваорвыалиаовтаол!!! dfdsgfdsf!!!'));
  str.SaveToFile('test.txt', TEncoding.ASCII);
  str.Free;
end;

Но на выходе сплошная печаль: ????????????????

Delphi XE5
Ответить с цитированием
  #2  
Старый 15.12.2014, 20:24
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Так и должно быть, ибо нефиг. ASCII -- американская кодировка, буковка "A" как бы намекает. Кириллицы в ней нет.

Выкинь нахрен весь этот быдлокод и сохраняй как мужик:
Код:
begin
  str.SaveToFile('test.txt', TEncoding.OEM); // для консоли и DOS
  str.SaveToFile('test.txt', TEncoding.ANSI); // для всего остального
end;
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 16.12.2014, 04:49
dnwest dnwest вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Я знаю, какая это кодировка, и тем не менее.
'TEncoding' does not contain a member named 'OEM'.
Ответить с цитированием
  #4  
Старый 16.12.2014, 12:44
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от dnwest
Я знаю, какая это кодировка, и тем не менее.
'TEncoding' does not contain a member named 'OEM'.
Да, гады. OEM у них нет, упустил. Тогда придется так:
Код:
var
  OEM: TEncoding;
begin
  OEM := TMBCSEncoding.Create(GetOEMCP);
  try
    str.SaveToFile('test.txt', OEM);
  finally
    OEM.Free;
  end;
end;
Если кодировка OEM используется везде в программе, лучше ее создать один раз и хранить где-то в полях класса/формы, а не пересоздавать каждый раз при использовании.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
dnwest (17.12.2014)
  #5  
Старый 17.12.2014, 13:11
dnwest dnwest вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо, но уже разобрался. Достаточно поменять пару строк.
Код:
procedure TForm2.Button1Click(Sender: TObject);
function AnsiToOem(AStr : String) : AnsiString;
  begin
    SetLength(Result, Length(AStr));
    //CharToOemBuff(PChar(AStr), PAnsiChar(Result), Length(AStr));
    CharToOem(PChar(AStr), PAnsiChar(Result));
  end;
var
  str: TStringList;
begin
  str := TStringList.Create;
  str.Add(AnsiToOem('ваорвыалиаовтаол!!! dfdsgfdsf!!!'));
  str.SaveToFile('test.txt');
  str.Free;
end;
Ответить с цитированием
  #6  
Старый 17.12.2014, 16:23
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

CharToOem -- старая функция, она псевдографику режет и другие медвежьи услуги оказывает. В юникодных приложениях использовать ее глупо. Тем более, что при этом двойное преобразование делается: вначале из Юникода в ANSI, а потом из ANSI в OEM.

Глупо не пользоваться встроенными средствами. В TEncoding используется WideCharToMultiByte, преобразующая символы без искажений.

В Интернете полно быдлокода, по мере сил стараюсь ему противостоять.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #7  
Старый 17.12.2014, 17:44
dnwest dnwest вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Freeman
CharToOem -- старая функция, она псевдографику режет и другие медвежьи услуги оказывает. В юникодных прилож...
Ваш пример тоже работает, буду использовать его, спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо dnwest за это полезное сообщение:
Freeman (17.12.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025