SetThreadLocale и UTF8 - PullRequest
       4

SetThreadLocale и UTF8

4 голосов
/ 29 июня 2009

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

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

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

1 Ответ

5 голосов
/ 29 июня 2009

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

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

...