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()
- однако, она может полностью обходить эту функцию и просто перейти непосредственно к внутренним.
В любом случае нет практических различий.