![]() |
|
#1
|
|||
|
|||
![]() Пытаюсь сохранять 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
|
||||
|
||||
![]() Так и должно быть, ибо нефиг. ASCII -- американская кодировка, буковка "A" как бы намекает. Кириллицы в ней нет.
Выкинь нахрен весь этот быдлокод и сохраняй как мужик: Код:
begin str.SaveToFile('test.txt', TEncoding.OEM); // для консоли и DOS str.SaveToFile('test.txt', TEncoding.ANSI); // для всего остального end; Не стоит путать форумы с богадельнями. © Bargest |
#3
|
|||
|
|||
![]() Я знаю, какая это кодировка, и тем не менее.
'TEncoding' does not contain a member named 'OEM'. |
#4
|
||||
|
||||
![]() Цитата:
Код:
var OEM: TEncoding; begin OEM := TMBCSEncoding.Create(GetOEMCP); try str.SaveToFile('test.txt', OEM); finally OEM.Free; end; end; Не стоит путать форумы с богадельнями. © Bargest |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
dnwest (17.12.2014)
|
#5
|
|||
|
|||
![]() Спасибо, но уже разобрался. Достаточно поменять пару строк.
Код:
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
|
||||
|
||||
![]() CharToOem -- старая функция, она псевдографику режет и другие медвежьи услуги оказывает. В юникодных приложениях использовать ее глупо. Тем более, что при этом двойное преобразование делается: вначале из Юникода в ANSI, а потом из ANSI в OEM.
Глупо не пользоваться встроенными средствами. В TEncoding используется WideCharToMultiByte, преобразующая символы без искажений. В Интернете полно быдлокода, по мере сил стараюсь ему противостоять. ![]() Не стоит путать форумы с богадельнями. © Bargest |
#7
|
|||
|
|||
![]() Цитата:
|
Этот пользователь сказал Спасибо dnwest за это полезное сообщение: | ||
Freeman (17.12.2014)
|