Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2014, 17:51   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос boost_regex кирилица

Здравствуйте.

С помощью регулярных выражений извлекаю из строки логин и пароль
Код:
        boost::regex Regex("Authorization=Login:([\\S]{3,18}):Passw:([\\S]{6,18});");
        boost::smatch Result;
        if(boost::regex_match(ete,  Result, Regex))
        {
            std::string Login = Result[1];
            std::string Passw = Result[2];
        }
Всё работает нормально, но в логине и пароле может использоваться кирилица, а в кирилице у меня получается 2 байта (то есть 2 символа считается за один), а не 1 как в латинских буквах. Изменил регулярное выражение увеличив количество символов разрешенных для ввода в логине и пароле в 2 раза [\\S]{3,36} и дальше хотел точно посчитать количество символов в строке, но почему-то запись кирилицы в регулярных выражениях [а-яА-Я] не работает. Подскажите пожалуйста как мне выяснить является ли символ кирилицей или латиницей?

Спасибо за внимание.

Последний раз редактировалось Stilet; 16.01.2014 в 21:34.
gunsoy вне форума Ответить с цитированием
Старый 15.01.2014, 20:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам нужно сначала кодировку выравнять, у вас судя по всему там UTF8.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.01.2014, 20:21   #3
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Да кодировка на клиенте и на сервере UTF8, а какая должна быть?
gunsoy вне форума Ответить с цитированием
Старый 15.01.2014, 20:59   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

UCS2 или UCS4
wchar_t
waleri вне форума Ответить с цитированием
Старый 16.01.2014, 17:43   #5
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Кодировок UCS2 или UCS4 у меня в CodeBlocks нет, а вот использовать wchar_t мне нельзя, вот тут по подробнее об этом написано http://programmersforum.ru/showthread.php?t=248261 , то есть мне нужно пользоваться кодировкой UTF8. Есть ли какой-нибудь выход из моей ситуации, то есть нужно всего лишь посчитать количество символов в строке std::string, если кирилица, то 2 символа считаю за один, если латиница, знак препинания или число, то 1 символ равен одному?
gunsoy вне форума Ответить с цитированием
Старый 16.01.2014, 20:18   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Мы начали с regex и закончили подсчетом символов в строке - так что собственно нужно?
UCS - это не кодировка. Скажем так UTF - это способ закодировать UCS.
waleri вне форума Ответить с цитированием
Старый 16.01.2014, 21:27   #7
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Объясню по подробнее.

В общем данные из строки и латиницу, и кирилицу извлекаю нормально, только вот по количеству символов они отличаются.

boost::regex Regex("Authorization=Login[\\S]{3,18}):Passw[\\S]{6,18});");

Вот например Логин был введён кирилицей, а пароль латиницей (Логин, Password). Получается так

Логин = 10 символов (так как каждый символ в кирилице равен 2 байта).
Password = 8 символов.

Регулярное выражение которое выше не годится, так как если ввести более 9 символов на кирилице, то регулярное выражение вернёт FALSE. Поэтому я изменил значение в логине и пароле с [\\S]{3,18} на [\\S]{3,36}. Дальше мне нужно узнать из каких символов состоят логин и пароль, чтобы правильно подсчитать сколько символов в логине и пароле. Для латинских букв такая запись [a-zA-Z] работает, а вот для кирилици такая запись [а-яА-Я] не работает. Для правильного подсчета символов, мне нужно как-нибудь определить является ли символ кирилицей или латиницей, подскажите пожалуйста что для этого нужно сделать?
gunsoy вне форума Ответить с цитированием
Старый 16.01.2014, 21:45   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А если пароль будет на "китаице", что тогда?
Если у вас только кирилица и латиница, зачем тогда вообще юникод нужен?
http://www.boost.org/doc/libs/1_48_0.../uni_iter.html
waleri вне форума Ответить с цитированием
Старый 17.01.2014, 21:04   #9
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Я к сожалению английского не знаю, я так понял мне нужно вот это

Код:
template <class BaseIterator>
class utf8_output_iterator
{
   utf8_output_iterator(const BaseIterator& b);
   utf8_output_iterator(const utf8_output_iterator& that);
   utf8_output_iterator& operator=(const utf8_output_iterator& that);

   // Other standard OutputIterator members here...
};
Может мне кто-нибудь помочь, что там происходит и как этим пользоваться?
gunsoy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кирилица Игорь_С Qt и кроссплатформенное программирование С/С++ 2 01.04.2013 13:24
кирилица в консоли AcTiV Общие вопросы C/C++ 4 26.12.2012 14:23
ЧПУ и Кирилица joe WordPress и другие CMS 1 25.10.2010 14:36
idTCPserver и кирилица BARNEY Работа с сетью в Delphi 7 21.10.2010 14:47
Кирилица в C++ ROD Помощь студентам 2 06.12.2008 14:50