Вопрос

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top