2012-01-27 4 views
4

Я пытаюсь нарисовать текст, используя библиотеку dll, которая имеет только интерфейсы инкапсулированных окон ANSI в ANSI, но мне нужно хранить строковые данные с помощью utf-8. Я не хочу преобразовывать строки с использованием функций MultiByte/WideChar, поэтому мне нужен подход для изменения CP_ACP в моем приложении, чтобы я мог вводить строковые данные в ANSI apis. Благодарю.Как изменить CP_ACP (0) окна ANSI apis в приложении?

ps: Я не хочу менять системную кодовую страницу по умолчанию.

+0

Я предлагаю вам добавить хотя бы тег языка. Тег Framework тоже будет полезен. –

+0

Спасибо, я добавил. – legendlee

+0

Там нет языка. C++? –

ответ

5

CP_ACP представляет собой систему кодировки Ansi. Вы не можете изменить это для каждого процесса или для каждого потока. Это общесистемная настройка. Если DLL действительно зависит от CP_ACP внутренне, тогда у вас нет выбора, кроме как конвертировать ваш из/в UTF-8 всякий раз, когда вы взаимодействуете с DLL.

1

«Как изменить CP_ACP?» - «Я не хочу (хочу) изменить системную кодовую страницу по умолчанию».

Ну, вам нужно выбрать. CP_ACP- системная кодовая страница по умолчанию.

+0

Спасибо. Есть ли способ изменить кодовую страницу для одного процесса? – legendlee

+1

@legendlee: Нет, нет. Существует 'SetThreadLocale()' и 'SetThreadUILanguaage()', но они работают с идентификаторами языка, а не с кодовыми страницами. UTF-8 не является языком, это кодировка Unicode. –

1

UTF8 не является кодовой страницей, и поскольку кодовые страницы имеют смысл только для функций ANSI, вы не можете делать то, что вы просите.

Если вы хотите сохранить строку как UTF8, вам нужно будет преобразовать из ANSI вашего приложения в unicode (широкий символ) с помощью MultiByteToWideChar(), а затем использовать WideCharToMultiByte() для преобразования в UTF8.

В качестве альтернативы, обновите приложение, чтобы использовать unicode/wide string внутри и преобразовать по мере необходимости.

+4

Сам UTF-8 не является кодовой страницей, но у Microsoft есть кодовая страница для UTF-8 - '65001' - для использования с функциями' MultiByteToWideChar() и 'WideCharToMultiByte()' (есть также кодовые страницы для UTF-7 и UTF-16). –

+5

И он также работает на SetConsoleCP(). Quacks как кодовая страница, это кодовая страница. –