2009-06-29 4 views
3

Поэтому я хочу использовать SetThreadLocale для установки кодовой страницы потоков в UTF8. До сих пор я использовал второй параметр макросов преобразования строки atl, например «CT2A (szBUF, CP_UTF8)». Но я хочу иметь возможность устанавливать кодовую страницу нити один раз в начале с помощью SetThreadLocale() и никогда больше не использовать второй параметр макроса преобразования.SetThreadLocale и UTF8

Как это сделать? SetThreadLocale не будет использовать параметр кодовой страницы, такой как CP_UTF8, только LCID. Какие параметры я должен кормить SetThreadLocale для достижения этого?

Имейте в виду, что у меня нет конкретного языка. Строки, которые я получаю, могут быть японскими, корейскими, английскими и т. Д. До сих пор у меня нет проблем с этим соединением строк при указании CP_UTF8 в качестве второго параметра макроса преобразования. Вы можете спросить «ну тогда почему бы просто не использовать второй параметр». Ответ: «потому что это может быть легко забыто членами команды, работающими над кодом. Было бы неплохо, если бы он корректно работал, используя стандартную версию макроса преобразования по умолчанию».

ответ

5

SetThreadLocale ожидает идентификатор языка, но UTF-8 не является идентификатором языка - это кодировка Unicode. Одна из целей идентификатора земельного участка - сообщить системе, как обрабатывать текст ANSI в диапазоне 128-255. Учитывая реальный язык, его кодовая страница будет использоваться при работе с такими символами. UTF-8, OTOH, представляет собой сжатое представление текста Unicode. Чтобы создать текст UTF-8, ваш вход должен быть Unicode. Учитывая текст ANSI, вы просто не знаете, как преобразовать верхний диапазон символов. Это делается, когда делается «вручную», чтобы преобразовать ANSI в UTF-8, вы должны сначала использовать MultiByteToWideChar с указанной кодовой страницей, и только тогда вы можете преобразовать полученную строку Unicode в UTF-8.

Теперь, вернемся к вашему вопросу - я бы пошел другим путем. Если дополнительная парадигма кодовой страницы вас так сильно, создайте макрос, который скроет его или так (или наследует класс CT2A и фиксирует второй параметр).

+0

Это объяснение имеет смысл, спасибо. Да, я думаю, что я буду использовать второй параметр. Кажется, это не простой способ установить кодовую страницу для потока один раз. –