WideCharToMultiByte() против wcstombs()

В чем разница между WideCharToMultiByte() и wcstombs() Когда использовать какой?

Ответы

Ответ 1

Вкратце: функция WideCharToMultiByte предоставляет страницы кодирования/кода, используемые для преобразования в списке параметров, а wcstombs - нет. Это основная PITA, поскольку стандарт не определяет, какую кодировку следует использовать для создания wchar_t, тогда как вы, как разработчик, обязательно должны знать, какая кодировка вы конвертируете в/из.

Кроме того, WideCharToMultiByte - это, конечно, функция Windows API и недоступна на любой другой платформе.

Поэтому я бы предложил использовать WideCharToMultiByte без малейшего представления о том, что ваше приложение специально не предназначено для переносимости на другие ОС, отличные от Windows. В противном случае вам может понадобиться бороться с wcstombs или (желательно IMHO) с использованием полнофункциональной переносной библиотеки Unicode, такой как ICU.

Ответ 2

  • WideCharToMultiByte - это функция Windows API, которая преобразует между многострочными кодовыми страницами Windows, хранящимися в CHAR, и UTF16, хранящиеся в WCHAR. Используемая кодовая страница передается в качестве первого параметра и может быть передана как CP_ACP, что означает кодовую страницу, специфичную для текущей локали системы, - заданную в панели управления "Инструмент локализации" для использования для программ, не поддерживающих Unicode ". Доступ к нему осуществляется с помощью #including и доступен только в Windows.

  • wcstombs - это стандартная функция выполнения C, которая преобразует между текущей кодировкой char * c-runtimes и кодировкой wchar_t *. setlocale iirc может использоваться для установки кодовой страницы (ов).

  • std:: codecvt - это шаблонный шаблон библиотеки стандартной библиотеки С++, используемый для преобразования строк между различными кодировками с использованием различных механических типов типов признаков для определения кодировок источника и назначения.

Существуют и другие библиотеки, в том числе ICONV или ICU, которые также выполняют различные преобразования Unicode ↔ multibyte.

Ответ 3

Как и любая другая функция: используйте функцию, которая делает то, что вам нужно в вашей программе.

WideCharToMultiByte преобразует из UTF-16 (используется как представление Win32 WCHAR) на кодовую страницу Win32 по вашему выбору.

wcstombs преобразует из внутреннего представления wchar_t, определенного реализацией, в текущее внутреннее многобайтовое представление, определенное реализацией.

Итак, если ваша программа является собственной программой Win32, которая использует множество функций API WIN32, которые используют и возвращают строки WCHAR, вам нужно WideCharToMultiByte. Если вы пишете некоторые функции на основе стандартной библиотеки (не Win32 API), которые работают со стандартными строками C wchar_t, вам нужно wcstombs.

Ответ 4

Основное отличие состоит в том, что wcstombs является стандартной функцией, поэтому используйте это, если код должен запускаться на любой платформе, отличной от Windows.

Ответ 5

wcstombs() является переносимым, тогда как функция WideCharToMultiByte() - только win32.

Когда дело доходит до этого, wcstombs() вызывает системную функцию, которая в Win32, скорее всего, будет прямым вызовом WideCharToMultiByte() - однако, она может полностью обходить эту функцию и просто перейти непосредственно к внутренним.
В любом случае нет практических различий.