У меня возникли проблемы с неправильным отображением символов Юникода в моем пользовательском интерфейсе. У меня есть только ресурсная библиотека, содержащая строковую таблицу, используемую для локализации пользовательского интерфейса. Я создаю DLL в Delphi XE3 с DLL-проектом (просто имеет {$R 'lang.res' 'lang.rc'}
в DPR-файле и дает мне lang.dll
). Я подтвердил, что мой файл lang.rc находится в формате UTF-8 с разрывами строк Windows CRLF. Когда я загружаю строки из DLL, символы Unicode смешиваются с интерфейсом. Вот некоторые подробности.Настройка кодировки Unicode из таблицы строк DLL ресурсов
фрагмент из таблицы строки:
STRINGTABLE
{
59,"180˚"
60,"90˚ CW"
61,"90˚ CCW"
}
Вот фрагменты кода, которые иллюстрируют проблема у меня с символами Unicode:
// explicitly assigning the degrees character shows 180˚ properly
ImageMenu180Action.Caption := '180˚';
// getting the resource from the DLL shows some weird two-character string for the degrees character
ImageMenu90CWAction.Caption := TLangHelper.LoadStr(IDS_ImageMenuRotationCW90);
// OutputDebugString shows the degrees character in the debugger output correctly
OutputDebugString(PChar('IDS_ImageMenuRotationCW90: '+TLangHelper.LoadStr(IDS_ImageMenuRotationCW90)));
Вот моя функция Delphi используется для загрузки строк от источника DLL:
class function TLangHelper.LoadStr(ResourceId: Integer):String;
var
Buff: String;
L: Integer;
begin
Result := '';
if LangDllHandle = 0 then begin
LangDllHandle := LoadLibrary(LANGUAGE_DLL_LOCATION);
if LangDllHandle = 0 then begin
ShowMessage('Error loading language localization resources.');
end;
end;
if LangDllHandle <> 0 then begin
L := 1024;
SetLength(Buff, L+1);
LoadString(LangDllHandle, ResourceId, PChar(Buff), L);
Result := String(PChar(Buff));
end;
end;
Любые предложения?
FOLLOW-UP:
Для китайских иероглифов, я должен был добавить предшествующую L для определения строки в файле .rc так, что DLL сборник признал их Unicode. Например (английский, китайский традиционный, китайский упрощенный, французский):
STRINGTABLE
{
35,"Status Bar"
1035,L"狀態欄"
2035,L"状态栏"
3035,"Barre d'état"
}
Не должны ли строки UTF-16, а не UTF-8? –
Где вы видели, что использование UTF-8 в вашем .rc-файле приведет к правильной кодировке в файле .res? Я нашел [ссылку с 2002 года] (http://www.delphipages.com/forum/archive/index.php/t-63889.html), в которой говорится, что вам нужно использовать специальный параметр командной строки для brcc32 ('- c65001'), чтобы указать кодировку файла .rc. Я сомневаюсь, что IDE использует этот параметр по умолчанию. –
@RobKennedy Это сработало, очень его ценит. Из-за отсутствия документации, указывающей в противном случае (я не мог найти ее), я предположил, что brcc32 по умолчанию будет использовать текстовое кодирование файла. Плохое предположение. Похоже, этот материал должен быть лучше документирован. Я не могу быть единственным, кто пытается это сделать. Я приму ответ, если вы захотите написать его. – spurgeon