Кодировка (ascii <-> unicode)
От: AlexCasual  
Дата: 29.10.14 15:08
Оценка:
Необходимо конвертировать данные из 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.
Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте?
Помогите пожалуйста разобраться со всем этим мракобесием)
Re: Кодировка (ascii <-> unicode)
От: BulatZiganshin  
Дата: 29.10.14 16:17
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>Если я правильно понимаю, то такая конвертация возможно только, если символ может быть представлен одним байтом в мультибайтовом варианте?


http://en.cppreference.com/w/cpp/locale/ctype/widen говорит то же самое и более того:

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).

более того, судя по таблице внизу этой страницы, нужного тебе "прямого поезда" просто нет
Люди, я люблю вас! Будьте бдительны!!!
Отредактировано 29.10.2014 16:21 BulatZiganshin . Предыдущая версия .
Re: Кодировка (ascii <-> unicode)
От: vpchelko  
Дата: 29.10.14 19:21
Оценка:
Здравствуйте, AlexCasual, Вы писали:
  Скрытый текст
AC>Необходимо конвертировать данные из ACSII текущей CodePage в UNICODE (UTF-8/UTF-32), знаю, что есть MultiByteToWideChar(), но хотелось бы использовать возможности нового С++11.
AC>Поискав на эту тему нашел, что есть способ с
AC>
AC>std::use_facet<std::ctype<>>.narrow()/widen()
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.
Сало Украине, Героям Сала
Отредактировано 29.10.2014 19:24 vpchelko . Предыдущая версия . Еще …
Отредактировано 29.10.2014 19:23 vpchelko . Предыдущая версия .
Re[2]: Кодировка (ascii <-> unicode)
От: uzhas Ниоткуда  
Дата: 29.10.14 19:34
Оценка: +1 :)
Здравствуйте, vpchelko, Вы писали:

V>А какое это должно иметь отношение к языку программирования?

>>> хотелось бы использовать возможности нового С++11.

ТС вместо WinAPI хочет использовать C++
имхо, гнилая затея
Re: Кодировка (ascii <-> unicode)
От: AleksandrN Россия  
Дата: 30.10.14 06:11
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>Помогите пожалуйста разобраться со всем этим мракобесием)


Посмотри на libiconv.
Re[2]: Кодировка (ascii <-> unicode)
От: AlexCasual  
Дата: 30.10.14 06:16
Оценка:
Здравствуйте, 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()
Re[3]: Кодировка (ascii <-> unicode)
От: BulatZiganshin  
Дата: 30.10.14 06:42
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii


ascii — это фиксированная 7-битная кодировка, а ты имеешь в виду ansi
Люди, я люблю вас! Будьте бдительны!!!
Re: Кодировка (ascii <-> unicode)
От: const_volatile  
Дата: 30.10.14 07:12
Оценка:
Здравствуйте, 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 в итоге не самый плохой вариант.
Re[2]: Кодировка (ascii <-> unicode)
От: BulatZiganshin  
Дата: 30.10.14 10:15
Оценка:
Здравствуйте, const_volatile, Вы писали:

_>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.


если речь идёт об msavc, то в нём всё есть: http://msdn.microsoft.com/en-us/library/hzz3tw78.aspx
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Кодировка (ascii <-> unicode)
От: AlexCasual  
Дата: 30.10.14 13:12
Оценка:
Здравствуйте, const_volatile, Вы писали:

_>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.


const_volatile, спасибо огромное! Всё стало более-менее на свои места)
Re[3]: Кодировка (ascii <-> unicode)
От: Хон Гиль Дон Россия  
Дата: 30.10.14 13:31
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:


_>>работа с разными кодировками в c++ напоминает закат солнца вручную. посмотри тут, например. в частности, придётся самому определять таблицы перекодировки cp1251<=>unicode, поскольку в стандартной библиотеке никаких кодировок кроме utf-8/utf-16 не прописано, и спросить у системы она не умеет. так что MultiByteToWideChar в итоге не самый плохой вариант.


BZ>если речь идёт об msavc, то в нём всё есть: http://msdn.microsoft.com/en-us/library/hzz3tw78.aspx


Оно зато аццки тормозное, потому что для каждого символа отдельно вызывает WideCharToMultiByte/MultiByteToWideChar. Если надо более-менее интенсивно работать с разными кодировками, лучше не страдать ерундой со стандартными потоками, а сразу переходить к использованию ICU.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Кодировка (ascii <-> unicode)
От: AlexCasual  
Дата: 30.10.14 18:12
Оценка:
А можно ещё одно уточнение? — часто в описаниях функций для работы с кодировками встречаю понятия conversion и converted, отсюда недопонимание, как будет работать следующий код :
std::wstring txtline;
std::wifstream wifs;
wifs.open("utf-8.txt");
//устанавливаем кодировку .1252
wifs.imbue(std::locale(".1251"));
while(std::getline(wifs, txtline))
{
    ....
}

это означает,что мы прочитаем файл, как кодированный в .1251, то есть все символы буду интерпретироваться, как символы из .1251?
Re[4]: Кодировка (ascii <-> unicode)
От: vpchelko  
Дата: 31.10.14 01:19
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, AlexCasual, Вы писали:


AC>>Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii


BZ>ascii — это фиксированная 7-битная кодировка, а ты имеешь в виду ansi


Ща насоветуют.
Сало Украине, Героям Сала
Re[3]: Кодировка (ascii <-> unicode)
От: vpchelko  
Дата: 31.10.14 01:19
Оценка:
Здравствуйте, AlexCasual, Вы писали:

AC>О чём речь вообще,дружок?

AC>std::codecvt_utf8<> позволяет конвертировать utf-8 <-> UCS2/UCS4, при этом я не работаю напрямую с WinApi.
AC>Вопрос состоял в том, что быть может есть способ аналогичными средствами конвертировать из ascii в utf-8, плюс не совсем была понятна логика работы std::use_facet<std::ctype<>>(loc).widen/narrow()

А как оно вообще в стандарте оказалось?
Сало Украине, Героям Сала
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.