Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
emeNy
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
1

"Debug Assertion Failed" при парсинге кириллической строки

25.09.2014, 12:19. Просмотров 744. Ответов 7
Метки нет (Все метки)

Здравствуйте.
Тривиальный пример.
Считываю из файла(UTF-8) строку: "Привет"
C++
1
2
3
4
5
6
7
8
9
10
11
setlocale(LC_ALL, "Russia");
ifstream ff;
ff.open("C:\\CBK2.fmc", ios::in);
std::string str;
std::string strout;
 
getline(ff, str);
qi::parse(teststr.begin(), teststr.end(), qi::raw[*qi::alpha], strout);
std::cout << strout;
 
f.close();
Получаю Debug Assertion Failed и собственно не парсит. С английским норм.
Что сделать, что бы работало?
0
Миниатюры
"Debug Assertion Failed" при парсинге кириллической строки  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2014, 12:19
Ответы с готовыми решениями:

Debug Assertion Failed
во время работы программы вылазиет вот такая ошибка что это такое и как с этим...

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере...

Ошибка: static assertion failed: error_invalid_expression BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr)
Здравствуйте форумчане. gcc (Ubuntu 14.04) 4.9.2 boost 1.54 Пытаюсь...

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz")
Найти в строке последовательность символов (&quot;abcd&quot;) и заменить ее другой...

О "нестабильности" или "переполнении" цикла foreach
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь:...

7
ForEveR
В астрале
Эксперт С++
8001 / 4759 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.09.2014, 15:32 2
emeNy, Использовать std::wstring как вариант.
0
emeNy
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
25.09.2014, 17:05  [ТС] 3
ForEveR, Да, я пробовал. Не помогло. Тоже самое
0
ForEveR
В астрале
Эксперт С++
8001 / 4759 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.09.2014, 20:21 4
emeNy, Сама строка из файла считывается или нет? Если нет, юзать std::wstring, std::wifstream. Если проблема в QI - читать доку. Так же можно попробовать отключить Debug режим, чтобы студия не ассертила все подряд.
0
Crast
70 / 70 / 5
Регистрация: 10.02.2013
Сообщений: 434
30.09.2014, 09:57 5
Жесть. Пришел на форум. Получил вредный совет, lol.
1. Локаль нужна для кодировки iso-88xx. И наверняка не в таком виде.
2. spirit не может парсить UTF-8 напрямую. Нужно преобразования в/из юникод, который он понимает.
Такой код еще может заработать:
C++
1
2
3
4
std::wstring strout;
std::wstring strin = boost::locale::conv::utf_to_utf<wchar_t>(str);
qi::parse(strin .begin(), strin .end(), qi::raw[*qi::standard_wide::alpha], strout);
std::cout << boost::locale::conv::utf_to_utf<char>(strout);
UPD: В регэкспах есть итератор для преобразования utf->unicode на ходу.
1
emeNy
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
30.09.2014, 16:21  [ТС] 6
Crast, большое спасибо, будем пробовать!

Добавлено через 2 часа 4 минуты
Crast,
C++
1
2
std::string str = "Привет";
std::wstring strin = boost::locale::conv::utf_to_utf<wchar_t>(str);
strin = ""
Не вышло

Добавлено через 1 минуту
Если str = "Hello" - работает
0
Crast
70 / 70 / 5
Регистрация: 10.02.2013
Сообщений: 434
01.10.2014, 08:15 7
iswalpha почему-то требует все-таки установить локаль(1), но выражения хорошо парсятся и без нее (2).
Это вообще какая-то девиантная функция )). Конечно это могли сделать для производительности. В любом случае я бы посоветовал избегать standard_wide::alpha, т.к. юникод должен парситься вне зависимости от конкретного языка.

Добавлено через 10 часов 3 минуты
UPD: чтобы распозновать юникод iswalpha требует только юникодную локаль.
0
emeNy
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
01.10.2014, 11:44  [ТС] 8
Crast, Ваши примеры очень помогли, спасибо!
0
01.10.2014, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2014, 11:44

Ошибка: invalid conversion from "int" to "SDL_RendererFlip"
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что...

Ошибка "неопределенная ссылка" при работе с std::thread
При попытке сделать что-либо с std::thread, выдает ошибку компиляции,...

Ошибка "Signal received" при использовании taglib
Когда пытаюсь вывести id3v2-&gt;artist(или любое другое ), вне функции где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru