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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
#1

std::string::find и кириллица - C++

25.08.2013, 21:54. Просмотров 4709. Ответов 28
Метки нет (Все метки)

есть простенький код
C++
1
2
3
4
5
6
7
8
9
#include <iostream>       // std::cout
#include <string>         // std::string
 
int main ()
{
    std::string str = "привет";
    std::cout << str.find("ве");
    return 0;
}
если в str содержится кириллица, то find работает как попало, выдаёт неверный результат.
с английскими буквами всё нормально. как бороться с этим, позарез нужен метод find, помогите пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::string::find и кириллица (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

28
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:31 #16
Цитата Сообщение от [WRG] Посмотреть сообщение
благодарю, вот это взлетело, без
C++
1
system("pause");
, конечно. в чем тут соль? что за буквы "L", в коде, без них не работает? ну и какие еще могут быть подводные камни при работе c wstring кроме wcout, если писать приходится в основном в файл, а не на экран?
Попробуй еще с твоим кодом, только с
C++
1
setlocale(LC_ALL,"");
Мне кажется, что в этом проблема. locale на разных ОС разные. На линуксе судя по всему нету "Russian".
0
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:36  [ТС] #17
нет, без wstring работать не хочет, даже с
C++
1
setlocale(LC_ALL, "")
Добавлено через 1 минуту
так локаль-то в системе какая положено стоит, по умолчанию
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bernhardt@NP355V4C:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:37 #18
Цитата Сообщение от [WRG] Посмотреть сообщение
нет, без wstring работать не хочет, даже с
C++
1
setlocale(LC_ALL, "")
Добавлено через 1 минуту
так локаль-то в системе какая положено стоит, по умолчанию
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bernhardt@NP355V4C:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
setlocale(LC_ALL,"ru_RU.UTF-8"); а так?
0
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:39  [ТС] #19
так тоже безрезультатно, пробовал
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:45 #20
http://www.cplusplus.com/reference/string/wstring/ тот же стринг, только хранит в wchar_t . L указывает, что к кавычках не обычные чары
1
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:47  [ТС] #21
благодарю, попробую использовать его
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.08.2013, 23:59 #22
Use UTF-8, Luke!
wstring - так себе вариант. Не переносим, если собираешься работать с текстом рассмотри вариант UTF-8.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
26.08.2013, 00:02 #23
Цитата Сообщение от Герц Посмотреть сообщение
Use UTF-8, Luke!
wstring - так себе вариант. Не переносим, если собираешься работать с текстом рассмотри вариант UTF-8.
Так как правильно код будет выглядеть, чтоб переносился и т.д.?
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
26.08.2013, 11:04 #24
C++
1
2
3
4
5
int main () {
    std::string str = u8"привет";
    std::cout << str.find(u8"ве");
    return 0;
}
Как-то так, но помимо этого для общения, например, с WinAPI, понадобится конверсия UTF-8 в UTF-16 и обратно, тут можно применить свой код (он довольно прост) или какой-нибудь libiconv.
Но стоит заметить, что строки лучше хранить в отдельном файле и читать из него, а не хранить в коде. В случае с Visual C++ исходники он интерпретирует в ASCII (например с кодировкой Windows-1251) и твоя строка в коде может превратиться в крякозябры. Если строки хранить в отдельном файле, но такого не случится.
0
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
26.08.2013, 15:21 #25
На VS2010 все работает.
0
Миниатюры
std::string::find и кириллица  
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.08.2013, 15:23 #26
zer0mail, у ТС Linux.
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
26.08.2013, 15:42 #27
введи библиотеку
C++
1
#include <locale>
а потом в main() вставляй
C++
1
setlocale(LC_ALL, "RUS")
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.08.2013, 16:37 #28
Toshik_, <locale.h> для setlocale. Ну или <clocale>, ибо locale никакого отношения к этой функции не имеет
0
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
26.08.2013, 18:16 #29
Цитата Сообщение от alsav22 Посмотреть сообщение
zer0mail, у ТС Linux.
Ни имел дела с разработкой в Linux. Но если бы имел, то сначала разобрался с кодировками: какие поддерживаются, какие средства поддержки есть и какие из них предпочтительнее ("родней").
0
26.08.2013, 18:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 18:16
Привет! Вот еще темы с ответами:

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)

Почему std::string_view МЕДЛЕННЕЕ, чем std::string? - C++
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до нескольких гигабайт). Почему в...

Как привести std::wstring к std::string? - C++
Как привести std::wstring к std::string?

Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &' - C++
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;sstream&gt; #include &lt;string&gt; using namespace std; int main() { string...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

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