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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
#1

UTF-8 - русские символы в char посимвольно - C++

17.07.2012, 14:05. Просмотров 3091. Ответов 12
Метки нет (Все метки)

Здравствуйте, в проекте используется UTF-8, и в char и в string я не могу обратиться к русскому символу, как к элементу массива, т.к. в UTF-8 русский символ занимает сразу два элемента массива... А мне нужно в цикле проходить строку и разбирать каждый символ... Как можно бороться с этим? Конвертировать всё в cp1251 не хочется... Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
17.07.2012, 14:37     UTF-8 - русские символы в char посимвольно #2
olegod, use wchar_t, Luke!

Вот незатейливый пример на С
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
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
 
int main(void) {
    wchar_t buf[BUFSIZ];
    
    setlocale(LC_ALL, "ru_RU.UTF-8");
    
    while ( printf("%ls: ", L"Написали") && scanf("%l[^\n]%*c", buf) == 1 ) {
        wchar_t * ptr;
        for ( ptr = buf; *ptr != L'\0'; ++ptr ) {
            if ( ! iswspace(*ptr) ) {
                if ( *ptr == L'я' )
                    *ptr = L'а';
                else if ( *ptr == L'Я' )
                    *ptr = L'А';
                else
                    *ptr += 1;
            }
        }
        printf("%ls: %ls\n", L"А получили", buf);
    }
    
    return 0;
}
Код
$ ./wchar_plus_1 
Написали: абвэюя
А получили: бвгюяа
В С++ можно использовать std::wstring, ну и std::wcin/std::wcout для ввода/вывода...
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
17.07.2012, 16:05  [ТС]     UTF-8 - русские символы в char посимвольно #3
A c wstring vsnprintf и substr работать будут?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 16:20     UTF-8 - русские символы в char посимвольно #4
Цитата Сообщение от olegod Посмотреть сообщение
A c wstring vsnprintf и substr работать будут?
substr работает, vsnprintf - нет.
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
17.07.2012, 16:56  [ТС]     UTF-8 - русские символы в char посимвольно #5
А как переводить char в wchat_t, работаю под linux, насколько я понял тут MultiByteToWideChar и т.п. не работают
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.07.2012, 16:58     UTF-8 - русские символы в char посимвольно #6
olegod, а зачем вам именно преобразовывать? Почему бы сразу не читать/хранить в wchar_t?
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
17.07.2012, 17:03  [ТС]     UTF-8 - русские символы в char посимвольно #7
А я строку получаю из GUI(QT) в формате string
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
17.07.2012, 17:12     UTF-8 - русские символы в char посимвольно #8
Цитата Сообщение от olegod Посмотреть сообщение
А я строку получаю из GUI(QT) в формате string
Может всё-таки QString? Тогда зачем её вообще во что-то конвертировать? В классе QString своих методов - как у дурака махорки. Честно говоря, с хода даже не придумаю задачу со строкой, которую ими решить не получится...
http://qt-project.org/doc/qt-4.8/qstring.html
Ну и напишите всё-таки подробнее, что Вы от этой строки получить хотите...
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 18:11     UTF-8 - русские символы в char посимвольно #9
Цитата Сообщение от easybudda Посмотреть сообщение
Может всё-таки QString?
Он string вот так получает:
C++
1
string clipboard2 = ui->textBrowser->toPlainText().toStdString();
Добавлено через 2 минуты
olegod, в QString есть вот такое:
C++
1
std::wstring  toStdWString () const
Тогда, наверное, можно так написать:
C++
1
wstring clipboard2 = ui->textBrowser->toPlainText().toStdWString();
Цитата Сообщение от easybudda Посмотреть сообщение
Ну и напишите всё-таки подробнее, что Вы от этой строки получить хотите...
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
void EvilWin::SelectE()
{
 
    int c = ui->textBrowser->textCursor().position();
 char aBuf[256];
  string clipboard2 = ui->textBrowser->toPlainText().toStdString();
   int p1;
   int p2;
   int flag = 0;
   for (int i = c; i >= 0; i--)
   {
     if( (clipboard2[i] == ';' || clipboard2[i] == '\n'))
     {
         flag = 1;
         p1 = i;
         cout << "Найден символ " ;
         if (clipboard2[i] == '\n') cout << "\\n" << " p1 = " << p1 << endl;
         else cout << clipboard2[i] << " p1 = " << p1 << endl;
         break;
     }
   }
 
  for (int i = c; i < clipboard2.size(); i++)
   {
     if( (clipboard2[i] == ';' || clipboard2[i] == '\n'))
     {
         flag = 1;
         p2 = i;
         cout << "Найден символ " ;
         if (clipboard2[i] == '\n') cout << "\\n" << " p2 = " << p2 << endl;
         else cout << clipboard2[i] << " p2 = " << p2 << endl;
         break;
     }
   }
  dBuf = clipboard2.substr(p1 + 1,p2 - p1 - 1);
str_format(aBuf, sizeof(aBuf), "%s, клик %i, p1 %i, p2 %i, %s строка", clipboard2.c_str(), c, p1, p2, dBuf.c_str());
    ui->textBrowser->setPlainText(aBuf);
 
}
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.07.2012, 22:11     UTF-8 - русские символы в char посимвольно #10
olegod, alsav22, ну тогда объясните мне, дураку, зачем вы из QString ещё что-то делаете? Как говорил уважаемый easybudda, методов у QString валом. Она уже сама индексируется по символам, а не по байтам, и сама (ну точнее через так называемые текстовый кодеки) преобразует текст между кодировками. Она имеет даже iterator и const_iterator - хоть в стандартные алгоритмы суй. Реверсивных итераторов, правда, ещё нет. Но вы и прямыми-то, я смотрю, не особо увлекаетесь, - индексы, да и только.

Господа, вот если вы уже взялись писать на Qt, то и пишите на Qt. Не скрещивайте змею с ёжиком
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 23:09     UTF-8 - русские символы в char посимвольно #11
Цитата Сообщение от talis Посмотреть сообщение
olegod, alsav22, ну тогда объясните мне, дураку, зачем вы из QString ещё что-то делаете? Как говорил уважаемый easybudda, методов у QString валом. Она уже сама индексируется по символам, а не по байтам, и сама (ну точнее через так называемые текстовый кодеки) преобразует текст между кодировками. Она имеет даже iterator и const_iterator - хоть в стандартные алгоритмы суй. Реверсивных итераторов, правда, ещё нет. Но вы и прямыми-то, я смотрю, не особо увлекаетесь, - индексы, да и только.

Господа, вот если вы уже взялись писать на Qt, то и пишите на Qt. Не скрещивайте змею с ёжиком
Лично я из QString ничего не делаю. olegod, задал вопрос на форуме, почему у него C++ код не работает. Я предложил рабочий вариант, именно, С++ кода. С индексами, без индексов, не важно, главное рабочий. И всё. Остальные вопросы к ТС.
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
19.07.2012, 03:33  [ТС]     UTF-8 - русские символы в char посимвольно #12
Всем спасибо! С QT действительно проще, хотя наверняка такой подход не такой производительный как реализация с нуля...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2012, 09:44     UTF-8 - русские символы в char посимвольно
Еще ссылки по теме:

Русские символы C++
Char *(UTF-8) -> char *(ANSI) C++
C++ Считывание String посимвольно либо Char in Switch
C++ Пропадают русские символи при конвертации из wchar_t to char
Case и русские символы C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
19.07.2012, 09:44     UTF-8 - русские символы в char посимвольно #13
Цитата Сообщение от olegod Посмотреть сообщение
С QT действительно проще, хотя наверняка такой подход не такой производительный как реализация с нуля...
... на ассемблере
Если пишете пользовательское приложение, гораздо больше шансов сделать его тормозным бессмысленно конвертируя данные из одного формата в другой и используя непонятные велосипеды вместо библиотечных методов. Как заметил уважаемый talis,
Цитата Сообщение от talis Посмотреть сообщение
Господа, вот если вы уже взялись писать на Qt, то и пишите на Qt.
А написание кода, крайне критичного ко времени - отдельная песня, требующая соответствующих знаний (при чём не только и не столько отдельно взятого языка программирования, сколько тонкостей работы ОС) и опыта...
Yandex
Объявления
19.07.2012, 09:44     UTF-8 - русские символы в char посимвольно
Ответ Создать тему
Опции темы

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