В чем разница между WideCharToMultiByte() и wcstombs() Когда какой из них использовать?
WideCharToMultiByte() против wcstombs()
Ответы (5)
Вкратце: функция WideCharToMultiByte
показывает кодировки/кодовые страницы, используемые для преобразования, в списке параметров, а функция wcstombs
— нет. Это основная PITA, поскольку стандарт не определяет, какую кодировку следует использовать для создания wchar_t
, а вам как разработчику обязательно нужно знать, в какую кодировку вы конвертируете.
Кроме того, WideCharToMultiByte
, конечно же, является функцией Windows API и недоступна ни на одной другой платформе.
Поэтому я бы предложил использовать WideCharToMultiByte
без раздумий, если ваше приложение специально не написано для переноса на операционные системы, отличные от Windows. В противном случае вы можете побороться с wcstombs
или (предпочтительно ИМХО) изучить возможность использования полнофункциональной переносимой библиотеки Unicode, такой как ОИТ.
WideCharToMultiByte
конвертирует из UTF-16 в кодовую страницу Win32 по вашему выбору. wcstombs
преобразует внутреннее представление wchar_t
, определенное реализацией, в текущее внутреннее многобайтовое представление, определенное реализацией. Разработчику не обязательно знать кодировки, определяемые реализацией.
- person Serge Dundich; 11.04.2011
WideCharToMultiByte — это функция Windows API, которая выполняет преобразование между определенными Windows многобайтовыми кодовыми страницами, хранящимися в CHAR, и UTF16, хранящимися в WCHAR. Используемая кодовая страница передается в качестве первого параметра и может быть передана как CP_ACP, что означает кодовую страницу, специфичную для текущей локали системы, установленную в инструменте локализации панели управления «Язык для использования для программ, отличных от Unicode». Доступ к нему осуществляется с помощью #include и доступен только в Windows.
wcstombs — это стандартная функция среды выполнения C, которая выполняет преобразование между текущей кодировкой char* среды выполнения c и кодировкой wchar_t*. setlocale iirc можно использовать для установки используемой кодовой страницы.
std::codecvt — это класс шаблона стандартной библиотеки C++ в , используемый для преобразования строк между различными кодировками с использованием различных механизмов типов свойств для определения исходной и конечной кодировок.
Существуют и другие библиотеки, в том числе ICONV или ICU, которые также выполняют различные преобразования юникода ‹-> многобайтовые.
Как и с любой другой функцией: используйте функцию, которая делает то, что вам нужно в вашей программе.
WideCharToMultiByte
преобразует UTF-16 (используется как представление Win32 WCHAR) в кодовую страницу Win32 по вашему выбору.
wcstombs
преобразует внутреннее представление wchar_t
, определенное реализацией, в текущее внутреннее многобайтовое представление, определенное реализацией.
Поэтому, если ваша программа является собственной программой Win32, которая использует множество функций WIN32 API, которые используют и возвращают строки WCHAR, вам нужно WideCharToMultiByte
. Если вы пишете некоторые функции на основе стандартной библиотеки (не Win32 API), которые работают со стандартными строками C wchar_t, вам потребуется wcstombs
.
Основное отличие состоит в том, что wcstombs
— это стандартная функция, поэтому используйте ее, если код должен работать на любой платформе, отличной от Windows.
wcstombs()
является переносимым, тогда как функция WideCharToMultiByte()
доступна только для win32.
Когда дело доходит до этого, wcstombs()
вызывает специфичную для системы функцию, которая в Win32, скорее всего, будет прямым вызовом WideCharToMultiByte()
, однако она может полностью обойти эту функцию и перейти прямо к внутренностям.
В любом случае , нет никакой практической разницы.