У меня есть таблица строк, которая определяет строку на китайском языке, как это:
STRINGTABLE
LANGAUGE 0x0C04, 0x03
BEGIN
1000 "检查环境..."...
END
Я пытаюсь загрузить эту строку в буфер wchar_t следующим образом:
#define UNICODE
#define _UNICODE
wchar_t buffer[512];
LoadString(DLL_HANDLE, (UINT) msg_num, buffer, 512);
MessageBox(NULL, buffer, NULL, NULL);
Однако строка, которая загружается в буфер, отличается от той, которая находится в моей таблице строк.
В моей таблице строк это выглядит так:
检查环境...
Но вот как это получается на экране:
環境をãƒã‚§ãƒƒã‚¯ä¸...
Не работает ли функция MessageBox на узких строках по умолчанию? Разве вам не нужно использовать «MessageBoxW»?
Редактировать:
Несколько вещей, чтобы проверить. Кодировка строк L «…» определяется реализацией. Стандарт не упоминает о кодировке символов wchar_t
; убедитесь, что вы используете ту же кодировку, что и в Windows. (Если я правильно помню, Windows ожидает UTF-16 — но я вполне могу ошибаться в этом).
В C ++ 11 введены 3 новых типа литеральных строк, и их префиксами являются «u8», «u» и «U», которые определяют UTF-8, UTF-16 & UTF-32 соответственно. C ++ 11 все еще не дает никаких гарантий относительно кодирования префиксов «L» из того, что я могу сказать, кроме того, что упомянуто в §2.14.3:
A character literal that begins with the letter L, such as L’x’, is a wide-character literal. A wide-character
literal has type wchar_t.23 The value of a wide-character literal containing a single c-char has value equal
to the numerical value of the encoding of the c-char in the execution wide-character set, unless the c-char
has no representation in the execution wide-character set, in which case the value is implementation-defined.
[ Note: The type wchar_t is able to represent all members of the execution wide-character set (see 3.9.1).
—end note ]. The value of a wide-character literal containing multiple c-chars is implementation-defined.
Ссылка §3.9.1 P5 гласит:
Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest
extended character set specified among the supported locales (22.3.1). Type wchar_t shall have the same
size, signedness, and alignment requirements (3.11) as one of the other integral types, called its underlying
type. Types char16_t and char32_t denote distinct types with the same size, signedness, and alignment as
uint_least16_t and uint_least32_t, respectively, in <stdint.h>, called the underlying types.
Опять же, нет упоминания о кодировании. Возможно, что Windows ожидает другую кодировку, чем та, которую использует строка вашего ресурса, и, таким образом, расхождение.
Вы можете проверить это, вызвав MessageBox с использованием строкового литерала L «с кодировкой» \ Uxxxxxxx «, чтобы ваши символы могли проверить.
Документация MSDN гласит, что формат должен быть похож на
IDS_CHINESESTRING L"\x5e2e\x52a9"
, Это не самое формальное из описаний. Я интерпретирую это как утверждение, что строки Unicode должны иметь префикс L
и закодированы с использованием \uxxxx
escape-коды