MFC LoadStringW не загружает японскую строку должным образом из таблицы строк

#c #windows #string #unicode #mfc

#c #Windows #строка #юникод #mfc

Вопрос:

В моем приложении MFC для набора символов установлено значение «Многобайтовый», я пытаюсь загрузить японскую строку, хранящуюся в таблице строк, используя функцию LoadStringW для загрузки строки из таблицы строк, но она всегда считывает ненужные символы.

Вы видите какие-либо проблемы в моем подходе?

Я не хочу менять набор символов на Unicode.

Еще одна интересная вещь: я создал еще один образец приложения и вставил одну японскую строку из основного проекта в таблицу строк нового образца приложения, затем попытался загрузить японскую строку с помощью LoadStringW, после чего она работает (набор символов многобайтовый для примера приложения.)

 WCHAR wBuf[1024];
int rc;

// load the string from resource file into a wide character array.
rc = LoadStringW(hInstance,iResourceID, wBuf, 1024);
  

Комментарии:

1. Ресурсы строк всегда хранятся в Юникоде, поэтому я не думаю, что здесь виноват параметр проекта набора символов. Можете ли вы обновить свой вопрос с помощью вызывающего кода LoadStringW() ?

2. Спасибо за публикацию кода. Это выглядит нормально, но вы проверили, что rc оно не равно нулю после вызова?

3. Да, ‘rc’ не равен нулю после вызова. Еще одно замечание: японские символы в представлении таблицы строк (просмотр строк) показывают символы мусора, но если вы откроете тот же файл в notepad , он покажет правильные японские строки.

4. Ах, значит, символы уже повреждены в таблице строк, что объясняет, почему LoadStringW() появляется сбой (ввод мусора, вывод мусора). Я бы рискнул и сказал, что кто-то или что-то хранит японские символы в многобайтовой кодировке (возможно, Shift JIS или EUC-JP) непосредственно в таблице строк. Возможно, вам захочется скопировать и вставить правильные значения из Notepad в представление ресурсов, чтобы «исправить» проблему.

5. Это происходит путем смешивания нескольких языков в RC-файле и не сохранения файла с правильной кодировкой, лучше иметь библиотеки DLL только для ресурсов для управления многоязычным приложением. [ссылка] support.microsoft.com/kb/198846

Ответ №1:

Убедитесь, что вы сохранили файл ресурсов в формате utf-16, а не ANSI. Visual Studio может обрабатывать эти файлы просто отлично.

Чтобы сохранить ее таким образом, откройте файл в Visual Studio как текст. Затем в меню file выберите Advanced Save Options , а затем в диалоговом окне укажите Unicode - Codepage 1200 .

Затем сохраните файл снова.

После этого ваши строки ресурсов будут работать должным образом.

Комментарии:

1. 1. Японские строки корректно отображаются в редакторе таблиц строк и в обычных текстовых файлах. Необходимо работать с WideCharToMultiByte, поскольку он преобразует японские символы в символы типа ‘???’

2. согласно MSDN, 1200 является только допустимой кодовой страницей в управляемом .Net