Чтение текстовых файлов в кодирвке не UTF8
Модератор: Модераторы
Чтение текстовых файлов в кодирвке не UTF8
Windows 7, Lazarus 1.6.
Столкнулся с проблемой чтение текстового файла в кодировке ANSI (да в OEM тоже).
Пробовал через TStringStream и TextFile - результат одинаковый, вопросительные знаки вместо русских букв.
Как с этим бороться?
Столкнулся с проблемой чтение текстового файла в кодировке ANSI (да в OEM тоже).
Пробовал через TStringStream и TextFile - результат одинаковый, вопросительные знаки вместо русских букв.
Как с этим бороться?
сначало надо уточнить - вопросительные знаки в какой момент - при чтении или при попытке посмотреть что прочиталось?
тобишь прочитаться может вполне нормально но вот при просмотре надо в utf8 конвертнуть, както так
тобишь прочитаться может вполне нормально но вот при просмотре надо в utf8 конвертнуть, както так
После Readln(fText, S), при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Код: Выделить всё
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;
Последний раз редактировалось Лекс Айрин 15.07.2016 12:35:25, всего редактировалось 1 раз.
Код: Выделить всё
Var rb:RawByteString;
s:string;
...
readln(txt,rb);
SetCodePage(rb,866,false);
s:=rb;
...не проверял, естессно... В теории что-то такое. Компилер должен быть 3 и выше.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
не волнуйтесь... восклицательный знак всего лишь заменяет не распознанный символ на просмотре. После преобразования текста все будет нормально.
Лекс Айрин писал(а):Ustas писал(а):при просмотре S уже на месте русских букв ?, это уже точно не во что не перекодируешь.
не волнуйтесь... восклицательный знак всего лишь заменяет не распознанный символ на просмотре. После преобразования текста все будет нормально.
ANSI: 3058.00,?????????? ??????? ?????????
AnsiToUTF8: 3058.00,���������� ������� ����������'
Кстати, это я уже пробовал метод TString.LoadFromFile. Т.е. разные методы приводят к одному результату.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Ustas, используй Cp1251ToUtf8 и будет тебе Щастье. Просто AnsiToUTF8 глючит. Это не раз поднималось на форуме.
Добавлено спустя 4 минуты 18 секунд:
ах да... чуть выше перепутал код. Заменил на правильный.
Добавлено спустя 4 минуты 18 секунд:
ах да... чуть выше перепутал код. Заменил на правильный.
, Cp1251ToUtf8 помогла, спасибо.Лекс Айрин писал(а):Лекс Айрин
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
да не за что. Если что, проблемы перевода кодировок и глюков при этом периодически поднимаются.
Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.
Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
Лекс Айрин писал(а):Как я понял, ANSI это не одна таблица, а куча разных. И, видимо, подставляется не та. Причем, эта волынка тянется чуть ли не с 95 винды.
Как я понял, ANSI это системная кодировка по умолчанию. Её можно менять. В винде кажись она по умолчанию UTF-16.
MysticCoder писал(а):Как я понял, ANSI это системная кодировка по умолчанию. Её можно менять. В винде кажись она по умолчанию UTF-16.
Ложь. UTF-16 это разновидность unicode, в которой один символ занимает не менее 2 байт. В ANSI один символ занимает один байт, и этот режим оставлен в современных версиях Windows для совместимости с приложениями, не поддерживающими Unicode. Кодировка Win1251 - это смесь ANSI с русскими символами, и в ней один символ тоже занимает один байт.
Добавлено спустя 1 час 27 минут 9 секунд:
Да... В настройках Windows есть параметр - кодировка по умолчанию для неUnicode-приложений. И там могут прописываться и Win1251, и другие ANSI-based кодировки.
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
slyubez писал(а):Ложь. UTF-16 это разновидность unicode, в которой один символ занимает не менее 2 байт. В ANSI один символ занимает один байт
Ну шо за бред, ANSI - системная, у меня в линухе она = UTF-8, могу поставить хоть какую и один символ будет занимать много байт. в винде то же самое, какую поставишь, столько символов и будет.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
MysticCoder, и что в этом хорошего?
Из-за всего этого приходится делать кучу лишних телодвижений, ибо некоторым прогам глубоко положить какую там кодировку система решила поставить. И ее собственная настраивается отдельно.
И такая хрень бывает, что в линуксе, что в винде. (ибычно, глючит в терминальном режиме)
Из-за всего этого приходится делать кучу лишних телодвижений, ибо некоторым прогам глубоко положить какую там кодировку система решила поставить. И ее собственная настраивается отдельно.
И такая хрень бывает, что в линуксе, что в винде. (ибычно, глючит в терминальном режиме)
MysticCoder писал(а):в винде то же самое, какую поставишь, столько символов и будет.
Если почитатете документацию на MSDN, то внезапно выяснится, что "консольными" и "системными" могут быть только исключительно байтовые кодировки, а кодировку UTF8 windows на уровне локалей системы вообще не поддерживает.
Зы, ваши "ANSI", "SYS", "OEM" суть epic fail в названиях -- вещи просто названы не своими собственными именами: по историческим причинам, потому что так захотелось и т.п.
Оттуда же появление национального идиотизма в windows в виде разных системной и консольной кодировок - причем, за "системную" выбрана совершенно никому не нужная на тот момент, но ГОСТированная "Основная кодировка DOS" cp1251 (намертво вшитая в знакогенераторы адаптеров CGA ЭВМ "Mazovia" и "ЕС-1841" - за что они вызывали лютую ненависть потребителя), а за консольную - "колхозный стандарт" cp866, в котором символы псевдографики были на своих местах, и которую применяли повсеместно. Не могу припомнить иного подобного прецедента. Может кто приведет еще пример другой национальной windows, чтобы в ней был такой же подход (чур, беларусь и украина в сторону!)?
