Windows 7, Lazarus 1.6.
Столкнулся с проблемой чтение текстового файла в кодировке ANSI (да в OEM тоже).
Пробовал через TStringStream и TextFile - результат одинаковый, вопросительные знаки вместо русских букв.
Как с этим бороться?
Модератор: Модераторы
procedure TMainForm.MenuOpenClick(Sender: TObject);
var
Str: TStringList;
begin
Str := TStringList.Create;
if OpenDialog1.Execute then
begin
MyFile := OpenDialog1.FileName;
Caption := MyFile + ':LexEditor';
// ожидается выбор кодировки текста возможны ошибки!!!
case OpenDialog1.FilterIndex of
1, 3: //т. к. здесь нет смысла знать шаблон открытия,то все виды вариантов
//с разными шаблонами объединяем в один.
begin //utf8
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines := Str;
MainForm.ComboLangCodePage.ItemIndex:=1;
end;
2,4:
begin //win1251
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := CP1251ToUTF8(Str.Text);
MainForm.ComboLangCodePage.ItemIndex:=2;
end;
5,6:begin // KOI8R
{$IFDEF MSWINDOWS}
Str.LoadFromFile(UTF8ToSys(MyFile));
{$ENDIF}
{$IFDEF LINUX}
Str.LoadFromFile(MyFile);
{$ENDIF}
MainEditor.Lines.Text := KOI8ToUTF8(Str.Text);
MainForm.ComboLangCodePage.ItemIndex:=0;
end;
else
begin
end;
end;
end
else
begin
end;
Str.Free;
MainForm.ShellTreeView1.Path:=MainForm.OpenDialog1.InitialDir;
end;
Var rb:RawByteString;
s:string;
...
readln(txt,rb);
SetCodePage(rb,866,false);
s:=rb;
Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
Лекс Айрин писал(а):Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
не волнуйтесь... восклицательный знак всего лишь заменяет не распознанный символ на просмотре. После преобразования текста все будет нормально.
, Cp1251ToUtf8 помогла, спасибо.Лекс Айрин писал(а):Лекс Айрин
Лекс Айрин писал(а):Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.
MysticCoder писал(а):Как я понял, ANSI это системная кодировка по умолчанию. Её можно менять. В винде кажись она по умолчанию UTF-16.
slyubez писал(а):Ложь. UTF-16 это разновидность unicode, в которой один символ занимает не менее 2 байт. В ANSI один символ занимает один байт
MysticCoder писал(а):в винде то же самое, какую поставишь, столько символов и будет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84