Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2013, 12:35
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию Delphi. Проблема с кодировкой не юникод данных на английской локали

В общем давно известная проблема, когда дельфи приложение запускается на винде с английской или другой локалью и пытается подгружать данные с Ansi файлов с русским текстом и получает заместо нормальных букв - знаки вопроса (???? ??) кракозябры такие

Возможно кто-то придумал как решить? На других конференциях нашел способ чтобы ресурсы которые уже в программе отображались нормально на юникод шрифтах (Tahoma) с чарсетом RUSSIAN_CHARSET

Код:
  SetThreadLocale(1049);
  Application.Initialize;

я так понимаю что он пытается при загрузке данных из файлов, представить в cp_1252 данные если в реестре стоит это значение

Вариант исправления локали в реестре не подходит, хотя работает
Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1251"="c_1251.nls"
"1252"="c_1251.nls"
перезагрузится после исправления

не буду же я каждому пользователю объяснять кто пользуется английской виндой что делать?

В общем прошу кто сталкивался с такой проблемой и нашел решение, подмогнуть
Как заставить программу игнорировать настройки реестра и кодировать в соответствии с CP_1251

Последний раз редактировалось hilaryon, 16.12.2013 в 12:38.
Ответить с цитированием
  #2  
Старый 16.12.2013, 12:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от hilaryon
В общем давно известная проблема, когда дельфи приложение запускается на винде с английской или другой локалью и пытается подгружать данные с Ansi файлов с русским текстом и получает заместо нормальных букв - знаки вопроса (???? ??) кракозябры такие
Где получает? Подробнее пожалуста.
Цитата:
Сообщение от hilaryon
Возможно кто-то придумал как решить? На других конференциях нашел способ чтобы ресурсы которые уже в программе отображались нормально на юникод шрифтах (Tahoma) с чарсетом RUSSIAN_CHARSET
Желательно что-бы все элементы управления на форме имели в свойстве Font.Charset:=RUSSIAN_CHARSET. Особенно это актуально было в WindowsNT4, но начиная с Windows2000 эта проблема вроде была решена.
Цитата:
Сообщение от hilaryon
Код:
  SetThreadLocale(1049);
  Application.Initialize;

я так понимаю что он пытается при загрузке данных из файлов, представить в cp_1252 данные если в реестре стоит это значение
Кто пытается?
Цитата:
Сообщение от hilaryon
Как заставить программу игнорировать настройки реестра и кодировать в соответствии с CP_1251
Кто, в каком случае и что кодирует-то?
Ответить с цитированием
  #3  
Старый 16.12.2013, 13:00
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

Программа в процессе работы берет данные из текстового файла (текст на русском языке) при их выводе получается черти что
Изображения
Тип файла: png 1.png (41.1 Кбайт, 18 просмотров)
Ответить с цитированием
  #4  
Старый 16.12.2013, 13:03
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

Программа в процессе работы берет данные из текстового файла (текст на русском языке) при их выводе получается черти что

1.png

на картинке все данные чтобы были подгружены с файлов получились вот такие, а все что были назначены в программе заранее остались нормальными

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

Цитата:
Сообщение от hilaryon
Программа в процессе работы берет данные из текстового файла (текст на русском языке) при их выводе получается черти что
У элементов управления которые отображают крякозябры установлено значение Font.Charset:=RUSSIAN_CHARSET ?
Какая версия Delphi?
Стандартные компоненты используются?
Ответить с цитированием
  #6  
Старый 16.12.2013, 13:09
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
У элементов управления которые отображают крякозябры установлено значение Font.Charset:=RUSSIAN_CHARSET ?
Какая версия Delphi?
Стандартные компоненты используются?

Да, RUSSIAN_CHARSET, уже по разному пробовал, и шрифты менял и чарсеты...

Пробовал на XE3 и XE5, результат однозначно тот же самый. компоненты используются разные, но вывод одинаково паршивый хоть в стандартных хоть в alphaskins
Ответить с цитированием
  #7  
Старый 16.12.2013, 13:10
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

2.png

на всех формах и вкладках такая же история, тексты которые грузятся с файла получают вот такой вид
если исправить в реестра значение кодовой страницы то будет отображаться нормально, но этот вариант не подходит по выше указанным причинам (

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

Цитата:
Сообщение от hilaryon
Да, RUSSIAN_CHARSET, уже по разному пробовал, и шрифты менял и чарсеты...

Пробовал на XE3 и XE5, результат однозначно тот же самый. компоненты используются разные, но вывод одинаково паршивый хоть в стандартных хоть в alphaskins
Сделай небольшой пример где эта проблема проявляется (только без дополнительных компонентов) - я посмотрю у себя на английской Windows.
Ответить с цитированием
  #9  
Старый 16.12.2013, 13:45
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

Пример.zip

увы не скомпилированный, так как размер архива тут не подходит, протестил сейчас тоже его на компе где стоит в реестре настройка
"1251"="c_1252.nls"

2013-12-16_134454.png

готовый проект можно скачать на моем сайте посмотреть как будет тоже http://hiki-soft.ru/download/

Последний раз редактировалось hilaryon, 16.12.2013 в 13:48.
Ответить с цитированием
  #10  
Старый 16.12.2013, 13:59
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

есть подозрение что в дельфи это не решаемо ( скорее всего обладателям такой винды придется фиксить все самостоятельно, менять реестр, ставить шрифты или еще что-то ( хотя очень печально, ведь часть текста она может выводить по русски что называется, но загружаемый текст зачем то кодирует через настройки системы
Ответить с цитированием
  #11  
Старый 16.12.2013, 16:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от hilaryon
К сожалению мне так и не удалось найти англоязычную Windows (как только найду - сразу же проверю), тем не менее в этом примере у элементов управления я почему то вижу что Font.Charset имеет значение DEFAULT_CHARSET, а не RUSSIAN_CHARSET. Если всё же установить RUSSIAN_CHARSET разве проблема не пропадает?
Цитата:
Сообщение от hilaryon
увы не скомпилированный, так как размер архива тут не подходит, протестил сейчас тоже его на компе где стоит в реестре настройка
"1251"="c_1252.nls"
Скомпилированный и не нужен был - только исходники.
Ответить с цитированием
  #12  
Старый 16.12.2013, 16:27
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

в этом примере я не стал менять ничего, это к сожалению не помогает (
Ответить с цитированием
  #13  
Старый 16.12.2013, 23:17
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Проблема больше похожа на известную ошибку unattend-установки Windows, которая в Windows XP решалась переключением темы туда-сюда: на любую другую, потом снова на ту, что была. Видел в интернетах, что и в Windows 7 проблема наличествует, но как решается, не знаю. Насколько помню, передергивание темы уже не помогает.

Хотя, если это уже Unicode VCL, проблема может быть и в самой программе.
__________________
Не стоит путать форумы с богадельнями. © Bargest

Последний раз редактировалось Freeman, 16.12.2013 в 23:20.
Ответить с цитированием
  #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.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
hilaryon (17.12.2013)
  #15  
Старый 17.12.2013, 19:26
hilaryon hilaryon вне форума
Прохожий
 
Регистрация: 19.11.2010
Сообщения: 18
Репутация: 10
По умолчанию

Честно говоря я не надеялся, что кто-то сможет найти решение, облазил кучу форумов, я думаю не я один скажу Вам за это исследование спасибо!

Сейчас же бегу тестить полученный вариант!

Еще нужно будет прикрутить автоматическое протыкивание кодировки по всем элементам всех форм, так как программа у меня насчитывает аж 22 формы
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter