Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Эта функция использует, неведомый мне, алгоритм для преобразования символов из ANSII таблицы в wchar_t, а не с Multi byte в wchar_t. Она ведет себя не так как написано в документации.
Аналогичная функция с MS Visual Studio делает примерно так
Во первых: это же STD. А значит и работать функция должна в соответствии с документацией по C++.
Во вторых: Реализация. Вот список кодовых таблиц поддерживаемых Виндой http://msdn.microsoft.com/en-us/library/dd317756(v=VS.85).aspx
А в данная функция, вроде бы, поддерживает UTF8 и OEM.
Зачем придумывать такой алгоритм если надежней воспользоваться функцией MultiByteToWideChar?
Такой функции нет в стандарте, это какие-то внутренние детали реализации (и имя на подчёркивание намекает), пользователям о этой функции знать незачем.
Эта функция как раз и реализует перекодировку из многобайтной кодировки в wchar. Для этого используется конечный автомат, управляемый таблицами (а кроме 8-битных кодировок существуют и многобайтные азиатские кодировки). В частном случае UTF-8 автомат закодирован явно (таблицы были бы слишком большими). Загляните в код iconv (или MultiByteToWideChar) — там увидите ещё сложнее.
Почему не используется MultiByteToWideChar? Ну, возможно, когда писался этот код, её ещё не было. Или она поддерживала очень ограниченный набор кодировок. Или медленнее. Или часть рантайма MS VС, а не системная.
Для работы этой перекодировщику нужны ещё таблицы, на которые ссылается pmbstate (они могут занимать сотни килобайт и даже мегабайты). Полюбопытствуйте, разберитесь, как оно работает.
Аналогичная функция с MS Visual Studio делает примерно так
Во вторых: Реализация. Вот список кодовых таблиц поддерживаемых Виндой
http://msdn.microsoft.com/en-us/library/dd317756(v=VS.85).aspx
А в данная функция, вроде бы, поддерживает UTF8 и OEM.
Зачем придумывать такой алгоритм если надежней воспользоваться функцией MultiByteToWideChar?
Эта функция как раз и реализует перекодировку из многобайтной кодировки в wchar. Для этого используется конечный автомат, управляемый таблицами (а кроме 8-битных кодировок существуют и многобайтные азиатские кодировки). В частном случае UTF-8 автомат закодирован явно (таблицы были бы слишком большими). Загляните в код iconv (или MultiByteToWideChar) — там увидите ещё сложнее.
Почему не используется MultiByteToWideChar? Ну, возможно, когда писался этот код, её ещё не было. Или она поддерживала очень ограниченный набор кодировок. Или медленнее. Или часть рантайма MS VС, а не системная.
P. S. Код mbtowc и _Mbtowc приведен полностью
Для работы этой перекодировщику нужны ещё таблицы, на которые ссылается pmbstate (они могут занимать сотни килобайт и даже мегабайты). Полюбопытствуйте, разберитесь, как оно работает.