Необходимо конвертировать данные из ACSII текущей CodePage в UNICODE (UTF-8/UTF-32), знаю, что есть MultiByteToWideChar(), но хотелось бы использовать возможности нового С++11.
Поискав на эту тему нашел, что есть способ с
std::use_facet<std::ctype<>>.narrow()/widen()
, но смутила фраза для narrow() Converts the (possibly wide) character c to multibyte representation if the character can be represented with a single byte, а для widen() Converts the single-byte character c to the corresponding wide character representation using the simplest reasonable transformation. Typically, this applies only to the characters whose multibyte encoding is a single byte.
Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте?
Помогите пожалуйста разобраться со всем этим мракобесием)
Здравствуйте, AlexCasual, Вы писали:
AC>Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте?
In practice, all characters whose multibyte representation is a single byte are usually widened to their wide character counterparts, and the rest of the possible single-byte values are usually mapped into the same placeholder value, typically CharT(-1).
более того, судя по таблице внизу этой страницы, нужного тебе "прямого поезда" просто нет
AC>Необходимо конвертировать данные из ACSII текущей CodePage в UNICODE (UTF-8/UTF-32), знаю, что есть MultiByteToWideChar(), но хотелось бы использовать возможности нового С++11. AC>Поискав на эту тему нашел, что есть способ с AC>
AC> , но смутила фраза для narrow() Converts the (possibly wide) character c to multibyte representation if the character can be represented with a single byte, а для widen() AC>Converts the single-byte character c to the corresponding wide character representation using the simplest reasonable transformation. Typically, this applies only to the characters whose multibyte encoding is a single byte. AC>Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте? AC>Помогите пожалуйста разобраться со всем этим мракобесием)
А какое это должно иметь отношение к языку программирования?
MultiByteToWideChar — это вообще WinApi, его можно дергать хоть из VB.
Здравствуйте, vpchelko, Вы писали:
V>А какое это должно иметь отношение к языку программирования? >>> хотелось бы использовать возможности нового С++11.
ТС вместо WinAPI хочет использовать C++
имхо, гнилая затея
Здравствуйте, vpchelko, Вы писали:
V>А какое это должно иметь отношение к языку программирования? V>MultiByteToWideChar — это вообще WinApi, его можно дергать хоть из VB.
О чём речь вообще,дружок?
std::codecvt_utf8<> позволяет конвертировать utf-8 <-> UCS2/UCS4, при этом я не работаю напрямую с WinApi.
Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii в utf-8, плюс не совсем была понятна логика работы std::use_facet<std::ctype<>>(loc).widen/narrow()
Здравствуйте, AlexCasual, Вы писали:
AC>Необходимо конвертировать данные из ACSII текущей CodePage в UNICODE (UTF-8/UTF-32), знаю, что есть MultiByteToWideChar(), но хотелось бы использовать возможности нового С++11.
механизм codecvt уже был прописан чуть ли не в стандарте 98 года. в c++11 добавлены типы char16_t и char32_t и некоторая инфраструктура для работы с ними.
AC>Поискав на эту тему нашел, что есть способ с AC>Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте? AC>Помогите пожалуйста разобраться со всем этим мракобесием)
работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.
Здравствуйте, const_volatile, Вы писали:
_>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.
Здравствуйте, const_volatile, Вы писали:
_>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.
const_volatile, спасибо огромное! Всё стало более-менее на свои места)
_>>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.
BZ>если речь идёт об msavc, то в нём всё есть: http://msdn.microsoft.com/en-us/library/hzz3tw78.aspx
Оно зато аццки тормозное, потому что для каждого символа отдельно вызывает WideCharToMultiByte/MultiByteToWideChar. Если надо более-менее интенсивно работать с разными кодировками, лучше не страдать ерундой со стандартными потоками, а сразу переходить к использованию ICU.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
А можно ещё одно уточнение? — часто в описаниях функций для работы с кодировками встречаю понятия conversion и converted, отсюда недопонимание, как будет работать следующий код :
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, AlexCasual, Вы писали:
AC>>Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii
BZ>ascii — это фиксированная 7-битная кодировка, а ты имеешь в виду ansi
Здравствуйте, AlexCasual, Вы писали:
AC>О чём речь вообще,дружок? AC>std::codecvt_utf8<> позволяет конвертировать utf-8 <-> UCS2/UCS4, при этом я не работаю напрямую с WinApi. AC>Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii в utf-8, плюс не совсем была понятна логика работы std::use_facet<std::ctype<>>(loc).widen/narrow()