|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Цитата:
|
#3
|
|||
|
|||
Программа в процессе работы берет данные из текстового файла (текст на русском языке) при их выводе получается черти что
|
#4
|
|||
|
|||
Программа в процессе работы берет данные из текстового файла (текст на русском языке) при их выводе получается черти что
1.png на картинке все данные чтобы были подгружены с файлов получились вот такие, а все что были назначены в программе заранее остались нормальными Последний раз редактировалось hilaryon, 16.12.2013 в 13:06. |
#5
|
||||
|
||||
Цитата:
Какая версия Delphi? Стандартные компоненты используются? |
#6
|
|||
|
|||
Цитата:
Да, RUSSIAN_CHARSET, уже по разному пробовал, и шрифты менял и чарсеты... Пробовал на XE3 и XE5, результат однозначно тот же самый. компоненты используются разные, но вывод одинаково паршивый хоть в стандартных хоть в alphaskins |
#7
|
|||
|
|||
2.png
на всех формах и вкладках такая же история, тексты которые грузятся с файла получают вот такой вид если исправить в реестра значение кодовой страницы то будет отображаться нормально, но этот вариант не подходит по выше указанным причинам ( Последний раз редактировалось hilaryon, 16.12.2013 в 13:13. |
#8
|
||||
|
||||
Цитата:
|
#9
|
|||
|
|||
Пример.zip
увы не скомпилированный, так как размер архива тут не подходит, протестил сейчас тоже его на компе где стоит в реестре настройка "1251"="c_1252.nls" 2013-12-16_134454.png готовый проект можно скачать на моем сайте посмотреть как будет тоже http://hiki-soft.ru/download/ Последний раз редактировалось hilaryon, 16.12.2013 в 13:48. |
#10
|
|||
|
|||
есть подозрение что в дельфи это не решаемо ( скорее всего обладателям такой винды придется фиксить все самостоятельно, менять реестр, ставить шрифты или еще что-то ( хотя очень печально, ведь часть текста она может выводить по русски что называется, но загружаемый текст зачем то кодирует через настройки системы
|
#11
|
||||
|
||||
Цитата:
Цитата:
|
#12
|
|||
|
|||
в этом примере я не стал менять ничего, это к сожалению не помогает (
|
#13
|
||||
|
||||
Проблема больше похожа на известную ошибку unattend-установки Windows, которая в Windows XP решалась переключением темы туда-сюда: на любую другую, потом снова на ту, что была. Видел в интернетах, что и в Windows 7 проблема наличествует, но как решается, не знаю. Насколько помню, передергивание темы уже не помогает.
Хотя, если это уже Unicode VCL, проблема может быть и в самой программе. Не стоит путать форумы с богадельнями. © Bargest Последний раз редактировалось Freeman, 16.12.2013 в 23:20. |
#14
|
||||
|
||||
Так как мне не удалось найти компьютер с установленной англоязычной 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; Теперь о том почему я считаю эту фичу багом. Во-первых непонятно с чего это вдруг язык ansi-текстов зависит от локализации Windows, а не например от настроек "Язык и региональные стандарты". Я например лет 5 сидел под англоязычной Windows 2000 создавая при этом нормальные русскоязычные текстовые файлы в ansi кодировке. Во-вторых по непонятной причине нет никакой возможности задать (в настройках или однократным вызовом процедуры) кодовую страницу по-умолчанию для ansi-текста. Всякий раз если не указать явно, будет вызываться API-функция GetACP которая возвращает язык локализации Windows. Вызов SetMultiByteConversionCodePage(1251) устанавливает кодовую страницу по-умолчанию похоже только для RawByteString. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
hilaryon (17.12.2013)
|
#15
|
|||
|
|||
Честно говоря я не надеялся, что кто-то сможет найти решение, облазил кучу форумов, я думаю не я один скажу Вам за это исследование спасибо!
Сейчас же бегу тестить полученный вариант! Еще нужно будет прикрутить автоматическое протыкивание кодировки по всем элементам всех форм, так как программа у меня насчитывает аж 22 формы |