![]() |
|
|
|
|
#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; |
|
#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; |
| Этот пользователь сказал Спасибо 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, преобразующая символы без искажений. В Интернете полно быдлокода, по мере сил стараюсь ему противостоять. ![]() |