Unicode или не Unicode - PullRequest
       2

Unicode или не Unicode

4 голосов
/ 27 сентября 2011

Я получаю значение из реестра. Это значение может содержать двухбайтовые символы. Позже мне придется передать это по сети клиенту C # для отображения. C # это все Unicode. Функция возвращает MBCS, если вы называете ее не-Unicode.

Что мне использовать?

string result = string(cbData);
RegQueryValueExA(h_sub_key, "DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData)

или

string result = string(cbData);
RegQueryValueExW(h_sub_key, L"DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData)

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Использование Unicode, когда это возможно, сделает вашу жизнь проще. Реестр изначально содержит Unicode и конвертирует в MBCS на лету, когда вы используете ReqQueryValueExA, зачем вам делать ненужное преобразование?

Преобразование в UTF-8 из UTF-16 может иметь смысл для информации, передаваемой по сети, но если вы контролируете оба конца соединения, в этом нет необходимости.

3 голосов
/ 27 сентября 2011

Нет, это не так.Строка, возвращаемая из первого фрагмента, кодируется в соответствии с текущей системной кодовой страницей .Может быть двухбайтовая кодировка.Может быть что угодно.Конечно, большая проблема: код C # на другом конце этого интернет-соединения не может угадать, какой может быть кодовая страница.

Так что не используйте первый фрагмент.Второй получает строку в utf16, нативную кодировку, используемую в Windows, result должно быть std :: wstring.Также кодировка, используемая C #, чтобы вы могли отправить двоичную строку.Хотя обычно это не очень хорошая идея, xml популярен.Это зависит от вас, чтобы установить формат провода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...