![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
а такая функция есть? - mblen
|
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
Да. Попробую с ней
Это сообщение отредактировал(а) chubaka - 26.3.2008, 14:12 |
|||
|
||||
| marcusmae |
|
||||||||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Имхо, максимально просто - это прекратить рассматривать мультибайтовые чары и перейти к их представлению, как указатели на байтовые массивы. Сначала нам нужна функция, которая будет в массиве байт находить по эталону два последовательных байта (два байта - это, по определению, представление для кириллицы в utf-8).
Далее, нужна функция, которая будет в массиве байт находить эталонную последовательность пар байт.
Ключевая функция - memcmp - сравнение байтовых последовательностей. Для проверки, строки я ввожу из файлов в формате UTF-8 : string.txt
substring.txt
Файлы - в UTF-8, но читаю, как байты :
В результате, для приведённых файлов
ответом является
то есть, коричневая лисица началась с десятой позиции в строке. В примечание - utfHeaderOffset - некий маркер utf-формата, который можно отладчиком увидеть в обоих строках. Мы должны его перепрыгнуть, иначе совпадений не будет найдено (-1). Вроде не очень сложно, да?.. Это сообщение отредактировал(а) marcusmae - 26.3.2008, 15:18 Присоединённый файл ( Кол-во скачиваний: 4 )
CyrUTF8.rar 179,63 Kb-------------------- ἀπὸ μηχανῆς θεός |
||||||||||||||
|
|||||||||||||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
marcusmae, спасибо огромное за такой полный ответ, но мне не помогло.
Исходная задача такая: есть 2 std::string обьекта. Они не загружаются из файла. Они через сокеты получают данные от другого сервера. Отсюда видимо значит что и маркера UTF формата не будет. Это сообщение отредактировал(а) chubaka - 27.3.2008, 09:00 |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
про маркеры никто ничего не говорил. короче я так понимаю, что проблема у вас в том, что вы или не знаете форматов сравниваемых строк, или не правильно их задаете. поясните от куда берется строка limit_string и как задается search_for. и в каком они формате и уверены ли вы, что они в этом формате. Это сообщение отредактировал(а) korian - 27.3.2008, 09:38 |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, про маркеры писал ув. marcusmae.
limit_string - HTML страница, полученная CURL'ом. search_for - данные из файла, для поиска в коде HTML страницы. Загружается ifstream'ом. |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
он писал что его надо перепрыгнуть, т.к. он нам нафиг не нужен, т.к. мы из начально знаем что там UTF-8. а по стандарту он туда пишется. если файл из которого читается search_for - UTF-8 и search_for - это std::string, а ifstream - это std::ifstream, и читается оно по типу ifstream.getline(search_for), то у вас из начально не правильные значение в search_for. Это сообщение отредактировал(а) korian - 27.3.2008, 09:59 |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
chubaka,
C/C++ рантайм не поддерживает работу с utf-8. поэтому перед использованием текст надо перекодировать в честный utf-16 и юзать W-функции см. MultiByteToWideChar |
|||
|
||||
| chubaka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 8.6.2007 Репутация: нет Всего: нет |
korian, уважаемый, вы гений =) Огромное спасибо. Действительна проблема была в том, что я неверно вводил данные в файл. Я программирую на удаленном сервере через SSH, и клиент PuTTy неверно принимал русские символы. Спасибо большое !
Также спасибо большое всем кто старался помочь. Много полезных советов на будущее |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |