Показать сообщение отдельно
  #14  
Старый 17.12.2013, 19:18
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Так как мне не удалось найти компьютер с установленной англоязычной Windows, скачал вместо этого (чтобы не устанавливать) Windows PE (Hiren's BootCD 15.2) и как оказалась эта бага действительно имеет место быть - если не указать явно, то программа всегда считает, что файлы содержащие "простой" ansi-текст имеют кодировку соответствующие локализации Windows.
Чтобы нормально загружался ansi-текст как русскоязычный не зависимо от локализации Windows нужно указывать явно кодировку 1251:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  cp1251: TMBCSEncoding;
begin
  cp1251 := TMBCSEncoding.Create(1251);
  try
    Memo1.Lines.DefaultEncoding := cp1251;
    Memo1.Lines.LoadFromFile('1.txt');
  finally
    cp1251.Free;
  end;
end;
Естественно объект cp1251 можно создать один раз, а использовать много раз. Фактически достаточно всего один раз присвоить в DefaultEncoding в каждый Memo (и т.п.), после чего можно объект cp1251 вообще уничтожить.

Теперь о том почему я считаю эту фичу багом.
Во-первых непонятно с чего это вдруг язык ansi-текстов зависит от локализации Windows, а не например от настроек "Язык и региональные стандарты". Я например лет 5 сидел под англоязычной Windows 2000 создавая при этом нормальные русскоязычные текстовые файлы в ansi кодировке.
Во-вторых по непонятной причине нет никакой возможности задать (в настройках или однократным вызовом процедуры) кодовую страницу по-умолчанию для ansi-текста. Всякий раз если не указать явно, будет вызываться API-функция GetACP которая возвращает язык локализации Windows. Вызов SetMultiByteConversionCodePage(1251) устанавливает кодовую страницу по-умолчанию похоже только для RawByteString.
Ответить с цитированием