WideCharToMultiByte () против wcstombs () - PullRequest
16 голосов
/ 11 апреля 2011

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

Ответы [ 5 ]

21 голосов
/ 11 апреля 2011

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

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

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

13 голосов
/ 11 апреля 2011
  • WideCharToMultiByte - это функция Windows API, которая преобразует между определенными в Windows многобайтовыми кодовыми страницами, хранящимися в CHAR, и UTF16, хранящимися в WCHAR. Используемая кодовая страница передается в качестве первого параметра и может передаваться как CP_ACP, что означает кодовую страницу, специфичную для текущей локали системы - задайте в панели управления инструмент локализации «Язык, используемый для программ, не поддерживающих Юникод». Доступ к нему осуществляется через #inclusive и доступен только в Windows.

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

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

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

3 голосов
/ 11 апреля 2011

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

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

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

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

2 голосов
/ 11 апреля 2011

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

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

2 голосов
/ 11 апреля 2011

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

...