Форум программистов, компьютерный форум CyberForum.ru

поиск в win1251 строке работает, а в UTF-8 - нет - C++

Восстановить пароль Регистрация
 
lohness
 Аватар для lohness
124 / 96 / 4
Регистрация: 24.04.2008
Сообщений: 885
02.12.2013, 11:46     поиск в win1251 строке работает, а в UTF-8 - нет #1
Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
.......
URLDownloadToFile(0, urlfile1.c_str(), L"SAVENAME1",0,0); 
filenam = "SAVENAME1";
 
..................
..................
 
ifstream fin(filenam);
if (!fin) cout << "Ошибка исходного файла!" << endl;
else
{
string str;
int number = 1;
while (getline(fin, str))
{
 
string::size_type n = str.find("jpg");
 
if (n != string::npos)
{
 
str.erase(str.begin(), str.begin() + str.find("img-fotki.yandex"));
auto it = str.find("XXXL");
if(it != string::npos)
{
str.replace(str.find("XXXL"), 4, "orig");
it = str.find('\"');
} 
auto it1 = str.find("XXL");
if(it1 != string::npos)
{
str.replace(str.find("XXL"), 3, "orig");
it1 = str.find('\"');
} 
 
auto it2 = str.find("XL");
if(it2 != string::npos)
{
str.replace(str.find("XL"), 2, "orig");
it2 = str.find('\"');
} 
 
auto it3 = str.find("L");
if(it3 != string::npos)
{
str.replace(str.find("L"), 1, "orig");
it3 = str.find('\"');
} 
гЂЂ
auto it4 = str.find("S");
if(it4 != string::npos)
{
str.replace(str.find("S"), 1, "orig");
it4 = str.find('\"');
} 
auto it5 = str.find("M");
if(it5 != string::npos)
{
str.replace(str.find("M"), 1, "orig");
it5 = str.find('\"');
}
str.erase(str.begin() + str.find('\"'), str.end());
 
........

Так вот если предварительно сохранить страницу в кодировке 1251 в файл SAVENAME1, то эта часть кода отрабатывает правильно оставляя от страницы только ссылки на картинки.
Если же дать программе самой скачать страничку (URLDownloadToFile), то она скачивается в кодировке UTF-8
и код вынимает из файла только две первые ссылки на картинки.

Визуально разница в том что в кодировке 1251 строчки которые нужно обрабатывать имеют вид:

HTML5
1
rel="nofollow"><IMG width="800" height="434" title="" alt="" src= " http://img-fotki.yandex.ru/get/9319/224143968.8/0_cfff7_ab09216d_XL.jpg "
а в UTF она гораздо длиннее и в одной строке файла включены несколько нужных ссылок
в итоге берется только одна ссылка, а после нее обработка строки заканчивается.

Архивы с кодом обрабатываемой страницы:
[cut]


Правильно ли я понимаю что надо предварительно разбить файл с UTF кодом
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 11:46     поиск в win1251 строке работает, а в UTF-8 - нет
Посмотрите здесь:

Преобразовние Utf-16 <=> Utf-8 C++
Поиск файла в каталоге если нет , то создать C++
Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 C++
C++ Сумму элементов в той строке, в которой нет отрицательных чисел
поиск в строке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.12.2013, 12:56     поиск в win1251 строке работает, а в UTF-8 - нет #2
Если всё в одной строке, то через поиск всех rel= в строке. Запоминайте позицию за jpg. С неё поиск следующего rel=.
lohness
 Аватар для lohness
124 / 96 / 4
Регистрация: 24.04.2008
Сообщений: 885
02.12.2013, 13:10  [ТС]     поиск в win1251 строке работает, а в UTF-8 - нет #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Если всё в одной строке, то через поиск всех rel= в строке. Запоминайте позицию за jpg. С неё поиск следующего rel=.
а если не известно в одной строке или нет?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.12.2013, 13:27     поиск в win1251 строке работает, а в UTF-8 - нет #4
Тогда весь текст считать в одну строку и там искать.
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
02.12.2013, 13:29     поиск в win1251 строке работает, а в UTF-8 - нет #5
Может копнуть в сторону wsting и сразу в проге предусмотреть, что в одной строке может быть несколько ссылок на рисунки.
lohness
 Аватар для lohness
124 / 96 / 4
Регистрация: 24.04.2008
Сообщений: 885
02.12.2013, 16:24  [ТС]     поиск в win1251 строке работает, а в UTF-8 - нет #6
решил так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        string::size_type n = str.find("img-fotki.yandex");
                
                while (n != string::npos)
                {
                str.erase(str.begin(), str.begin() + str.find("img-fotki.yandex"));
                string s1 =  str.substr(0, str.find('\"'));
                auto it = s1.find("XXXL");
                if(it != string::npos)
                {
                s1.replace(s1.find("XXXL"), 4, "orig");
                it = s1.find('\"');
                }       
                auto it1 = s1.find("XXL");
                if(it1 != string::npos)
                {
                s1.replace(s1.find("XXL"), 3, "orig");
                it1 = s1.find('\"');
                }       
                
                auto it2 = s1.find("XL");
                if(it2 != string::npos)
                {
                s1.replace(s1.find("XL"), 2, "orig");
                it2 = s1.find('\"');
                }       
                
                auto it3 = s1.find("L");
                if(it3 != string::npos)
                {
                s1.replace(s1.find("L"), 1, "orig");
                it3 = s1.find('\"');
                }       
                auto it4 = s1.find("S");
                if(it4 != string::npos)
                {
                s1.replace(s1.find("S"), 1, "orig");
                it4 = s1.find('\"');
                }       
                auto it5 = s1.find("M");
                if(it5 != string::npos)
                {
                s1.replace(s1.find("M"), 1, "orig");
                it5 = s1.find('\"');
                }
                fout << "<P><IMG SRC=http://" << s1 << ">" << endl;
                str.erase(str.begin(), str.begin() + str.find("\""));
                std::wstring wstr(s1.begin(), s1.end());
вроде работает правильно
Yandex
Объявления
02.12.2013, 16:24     поиск в win1251 строке работает, а в UTF-8 - нет
Ответ Создать тему
Опции темы

Текущее время: 21:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru