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

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

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

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

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

Здравствуйте, в проекте используется UTF-8, и в char и в string я не могу обратиться к русскому символу, как к элементу массива, т.к. в UTF-8 русский символ занимает сразу два элемента массива... А мне нужно в цикле проходить строку и разбирать каждый символ... Как можно бороться с этим? Конвертировать всё в cp1251 не хочется... Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2012, 14:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос UTF-8 - русские символы в char посимвольно (C++):

Русские символы в массиве char - C++
имеется функция возвращающая массив байтов(символов), если данная строка английское слово то все нормально, иначе получается...

Char *(UTF-8) -> char *(ANSI) - C++
Есть строка в кодировке UTF-8(если не ошибаюсь) типа char * Вот так ее я вижу в MSVC++10 - комментарии(оригинал - комментарии)...

Считывание String посимвольно либо Char in Switch - C++
Здравствуйте, суть такова: Нужно написать 3 числа (0-7), а дальше считать каждое число по отдельности и в зависимости от числа, выполнить...

Считать файл в переменную типа char, и работать посимвольно - C++
считать файл в переменную типа char, а дальше с ней нужно работать посимвольно, так вот, как написать while(пока это не последний символ...

Широкие символы wchar_t wstring не хотят принимать русские символы - C++
Собственно вопрос в шапке, вот примеры: std::wstring str = L"блин комом"; и такое: wchar_t stroka = L"abcdefghijklmnopqrstuvwxyz...

C++, UTF-8, char - C++
Приветсвую всех. Правильно ли я рассуждаю: 1) Если мне нужно использовать символы юникода в программе (самые немыслимые иероглифы,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
17.07.2012, 14:37 #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  [ТС] #3
A c wstring vsnprintf и substr работать будут?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 16:20 #4
Цитата Сообщение от olegod Посмотреть сообщение
A c wstring vsnprintf и substr работать будут?
substr работает, vsnprintf - нет.
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
17.07.2012, 16:56  [ТС] #5
А как переводить char в wchat_t, работаю под linux, насколько я понял тут MultiByteToWideChar и т.п. не работают
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.07.2012, 16:58 #6
olegod, а зачем вам именно преобразовывать? Почему бы сразу не читать/хранить в wchar_t?
olegod
0 / 0 / 0
Регистрация: 04.05.2011
Сообщений: 113
17.07.2012, 17:03  [ТС] #7
А я строку получаю из GUI(QT) в формате string
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
17.07.2012, 17:12 #8
Цитата Сообщение от olegod Посмотреть сообщение
А я строку получаю из GUI(QT) в формате string
Может всё-таки QString? Тогда зачем её вообще во что-то конвертировать? В классе QString своих методов - как у дурака махорки. Честно говоря, с хода даже не придумаю задачу со строкой, которую ими решить не получится...
http://qt-project.org/doc/qt-4.8/qstring.html
Ну и напишите всё-таки подробнее, что Вы от этой строки получить хотите...
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 18:11 #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 #10
olegod, alsav22, ну тогда объясните мне, дураку, зачем вы из QString ещё что-то делаете? Как говорил уважаемый easybudda, методов у QString валом. Она уже сама индексируется по символам, а не по байтам, и сама (ну точнее через так называемые текстовый кодеки) преобразует текст между кодировками. Она имеет даже iterator и const_iterator - хоть в стандартные алгоритмы суй. Реверсивных итераторов, правда, ещё нет. Но вы и прямыми-то, я смотрю, не особо увлекаетесь, - индексы, да и только.

Господа, вот если вы уже взялись писать на Qt, то и пишите на Qt. Не скрещивайте змею с ёжиком
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 23:09 #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  [ТС] #12
Всем спасибо! С QT действительно проще, хотя наверняка такой подход не такой производительный как реализация с нуля...
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
19.07.2012, 09:44 #13
Цитата Сообщение от olegod Посмотреть сообщение
С QT действительно проще, хотя наверняка такой подход не такой производительный как реализация с нуля...
... на ассемблере
Если пишете пользовательское приложение, гораздо больше шансов сделать его тормозным бессмысленно конвертируя данные из одного формата в другой и используя непонятные велосипеды вместо библиотечных методов. Как заметил уважаемый talis,
Цитата Сообщение от talis Посмотреть сообщение
Господа, вот если вы уже взялись писать на Qt, то и пишите на Qt.
А написание кода, крайне критичного ко времени - отдельная песня, требующая соответствующих знаний (при чём не только и не столько отдельно взятого языка программирования, сколько тонкостей работы ОС) и опыта...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2012, 09:44
Привет! Вот еще темы с ответами:

масив Char (Windows-1251, ASCII, UTF-8) - C++
Перехожу с мелкомяхких на linux (с Delphi на С++), так как все мои программы занимаются обработкой строк то решил сначала разобраться со...

Русские буквы в c++ char - C++
Здравствуйте, уже все облазил так ничего не нашел и не понял, нужно понять одну простую вещь, необходимо ввести с клавиатуры русское слово...

Русские символы - C++
Подскажите пожалуйста как сделать правильный вывод русского алфавита, так как при выводе выдает иероглифы, есть задавать данные изначально,...

Русские символы - C++
Написал программу. Компилю из под cygwin g++. Ругается: 4.cpp:27:18: предупреждение: многознаковая символьная константа if((str...


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

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

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