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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lohness
131 / 103 / 5
Регистрация: 24.04.2008
Сообщений: 945
#1

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

02.12.2013, 11:46. Просмотров 298. Ответов 5
Метки нет (Все метки)

Есть код:

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 кодом
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 11:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос поиск в win1251 строке работает, а в UTF-8 - нет (C++):

Не работает поиск подстроки в строке - C++
Не работает поиск подстроки в строке в ф-ии void ChangingStudent(). Заранее спасибо #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include...

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 - C++
Собсно сабж.

Поиск слова в строке некорректно работает на повторяющихся рядом стоящих буквах - C++
вроде все работает, но когда введено два одинаковых символа допустим bb и в слове которое нужно найти вводим bb то считает все символы bb....

Позиция символа в UTF-8 строке - C++
#include &lt;iostream&gt; using namespace std; void main() { // файл в UTF-8 без БОМ system(&quot;chcp 65001&quot;); char* s =...

Работа с массивами. Поиск наименьшего числа в строке и наибольшего в строке - C++
Добрый вечер. Надо найти наименьшее число в строке и наибольшее в столбце. Примерно вот так должно искать. потом надо собрать новый...

Перекодировка из EBCDIC в win1251 - C++
Помогите пожалуйста составить прогу перекодировки файла из EBCDIC в win1251

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.12.2013, 12:56 #2
Если всё в одной строке, то через поиск всех rel= в строке. Запоминайте позицию за jpg. С неё поиск следующего rel=.
0
lohness
131 / 103 / 5
Регистрация: 24.04.2008
Сообщений: 945
02.12.2013, 13:10  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Если всё в одной строке, то через поиск всех rel= в строке. Запоминайте позицию за jpg. С неё поиск следующего rel=.
а если не известно в одной строке или нет?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.12.2013, 13:27 #4
Тогда весь текст считать в одну строку и там искать.
0
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 13:29 #5
Может копнуть в сторону wsting и сразу в проге предусмотреть, что в одной строке может быть несколько ссылок на рисунки.
0
lohness
131 / 103 / 5
Регистрация: 24.04.2008
Сообщений: 945
02.12.2013, 16:24  [ТС] #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());
вроде работает правильно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 16:24
Привет! Вот еще темы с ответами:

Multimap STL - работает только запись в файл, поиск в файле не работает - C++
И снова здравствуйте. Снова я прошу вашей помощи. Переделал программу с мапом в мульти мап, но что то пошло не так и работает только запись...

Преобразовние Utf-16 <=> Utf-8 - C++
Вопрос казалось бы простой, но нормально ответа на него я пока не нашел. Нужно вывести строчку юникода(UTF-16) в файл с изменением...

.NET 4.x Декодирование win1251 - UTF-8 - C#
Уважаемые программисты, нужна помощь с кодировкой. В общем, имеется запрос на сайт VK , он возвращает мне сроку. Так вот , в чём проблема -...

Конвертация из UTF-8 в Win1251 - А где решение? - Visual Basic
Comanche, это хорошо, что ты разобрался, но ведь и другие хотели бы знать решение. В чем была проблема? Возможно, что ты не учитывал,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.12.2013, 16:24
Ответ Создать тему
Опции темы

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