Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::wstring в std::string 
:(
    Опции темы
ТарасАтавин
Дата 27.8.2013, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Как лучше преобразовать? Быстрей и короче? И при этом из utf8 в анси.

Это сообщение отредактировал(а) ТарасАтавин - 27.8.2013, 15:16


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 27.8.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ТарасАтавин, wstring содержит строку не в кодировке utf8. Если тебе необходимо преобразовать wstring в ANSI, то используй функцию wcstombs.
PM   Вверх
ТарасАтавин
Дата 28.8.2013, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bsa @  27.8.2013,  16:05 Найти цитируемый пост)
ТарасАтавин, wstring содержит строку не в кодировке utf8. Если тебе необходимо преобразовать wstring в ANSI, то используй функцию wcstombs. 
А в чём же? В utf16?

Добавлено через 2 минуты и 15 секунд
Цитата(bsa @  27.8.2013,  16:05 Найти цитируемый пост)
 используй функцию wcstombs. 
size измеряется в символах?

Добавлено через 8 минут и 57 секунд
Цитата
При успешном выполнении функция wcstombs() возвращает количество байтов, помещенных в массив out. При возникновении ошибки возвращается значение -1.
 Как это понимать с учётом того, что тип возвращаемого значения size_t?

Это сообщение отредактировал(а) ТарасАтавин - 28.8.2013, 07:55


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Alexeis
Дата 28.8.2013, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(ТарасАтавин @  28.8.2013,  08:54 Найти цитируемый пост)
А в чём же? В utf16?

  Вероятно в одной из 2х(4х) байтных кодировок smile . UTF8 переменнобайнтая. 2х(4х) байтные символы для нее не подходят.

Добавлено через 2 минуты и 41 секунду
Цитата(ТарасАтавин @  28.8.2013,  08:54 Найти цитируемый пост)
Как это понимать с учётом того, что тип возвращаемого значения size_t?

Цитата(http://www.cplusplus.com/reference/cstdlib/wcstombs/?kw=wcstombs)

If a wide character that does not correspond to a valid multibyte character is encountered, a (size_t)-1 value is returned.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 28.8.2013, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(ТарасАтавин @  28.8.2013,  08:54 Найти цитируемый пост)
size измеряется в символах?

Цитата
     2. The length limit forces a stop.  In this case the  number  of  bytes
       written to dest is returned, but the shift state at this point is lost.

Цитата
       The programmer must ensure that there is room for at least n  bytes  at
       dest.


wcstombs - расшифровывается как wide-char string to multi-byte string. Multi-byte string - это локальная 8-ми битная кодировка. В Windows - это кодировки вида Windows-1251; а в *nix: utf8, koi8-r, latin1 и пр., задается переменными среды LANG и LC_*.
PM   Вверх
akizelokro
Дата 28.8.2013, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ТарасАтавин @  28.8.2013,  07:54 Найти цитируемый пост)
А в чём же? В utf16?

widestring - Unicode

UTF - расшифровывается как "Unicode Transformation Format" или что-то навроде. 
Если хочешь преобрзовать из UTF в Unicode, to Multibyte кодировку преобразуешь к WideString преобразованием mcztowcs, обратным к подсказанному тебе  wcstomcs

Multibyte это не 8-битная кодировка, это как минимум 8битная кодировка.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
bsa
Дата 28.8.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(akizelokro @  28.8.2013,  11:29 Найти цитируемый пост)
Multibyte это не 8-битная кодировка, это как минимум 8битная кодировка.
не путай человека раньше времени  smile 

PM   Вверх
akizelokro
Дата 28.8.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



ANSI кодировкой в Windows называются родные (по крайней мере для русскоязычной винды) Windows1251 (не путь с разными KOI8, Ascii).

Добавлено через 9 минут и 26 секунд
Цитата(bsa @  28.8.2013,  10:33 Найти цитируемый пост)
не путай человека раньше времени


Тут сам запутаешься.
Я вот видел в MSDN и такой вариант, кокретно прописанный как AnsiString  smile c дополнительными функциями конвертации, какими как AnsiToOem и OemToAnsi.
Самая веселуха начинается при написании ActiveX-компонент, где ещё подступает BSTR (тип строк из Бейсика) и начинаются порой полёты по конвертации из ладно бы ещё Юникода в BSTR, а то ведь и наоборот, и попутно там мелькает MFCшный тип CString, ранее выдвигавшийся как возможный будущий стандарт  smile 



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 28.8.2013, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ТарасАтавин @  28.8.2013,  07:54 Найти цитируемый пост)
 Как это понимать с учётом того, что тип возвращаемого значения size_t?


size_t, наверно, просто знаковое целое число.
И эта.. делай как тебе сказали. Объяснять тебе придётся действительно долго. Прими как должное, что в wstring используется в Винде Юникод, а UTF это надостроечный формат к Юникоду. ANSI в винде - Windows CP1251.
ты же работаешь в рамках стандарта С++ c wstring и string, и работай с ними. Компилятор тебе выдаст, где корректное, а где нет преобразование.
а std::getline работает только для простых string, а не для wstring.

Об таких словах как ANSI, ASCII или OEM кодировки временно забудь.
Есть пара рецептов, как перейти от одного типа строк к другим, или от одной кодировки в к другой. Их и используй, когда понадобится (бывает это, к счастью, редко), это избавит тебя от излишней головной боли.


Это сообщение отредактировал(а) akizelokro - 28.8.2013, 11:07


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
bsa
Дата 29.8.2013, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(akizelokro @  28.8.2013,  12:03 Найти цитируемый пост)
size_t, наверно, просто знаковое целое число.

беззнаковое.
sizeof(size_t) >= sizeof(void*).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.