Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
1

Сравнение объектов класса string содержащих русский текст

18.06.2019, 03:57. Показов 1160. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можно ли добиться того, чтобы стандартные операции сравнения в классе string корректно работали с русскими символами.
Вообще я смотрю ребята сишарписты устроились очень комфортно, все блин получили на халяву.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2019, 03:57
Ответы с готовыми решениями:

Сравнение строк содержащих русский текст
Хочу чтобы яваскрипт находил в тексте слова и сравнивал их с содержимым обьекта. Если совпадение...

Преобразовать латинский текст string в русский текст string
Пишу приложение, которое мне будет отправлять в твиттер нужные сообщения. Встретился со следующей...

string русский текст
Привет.. вобщем тут по примеру делал что-то типа телефонной книги(да практически все списал), так...

Сравнение объектов string
Вопрос такой. Мне нужно организовать поиск по ключу типа string. Но сравниваются они посимвольно. ...

15
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.06.2019, 09:16 2
Цитата Сообщение от Просто Саша Посмотреть сообщение
Можно ли добиться того, чтобы стандартные операции сравнения в классе string корректно работали с русскими символами.
А что с ними не так?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 09:46  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что с ними не так?
Ну выполните, например, вот такой оператор

C++
1
cout << boolalpha ("Ё"s > "Е"s) << endl;
Сразу поймете, что тут не так.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.06.2019, 09:58 4
Цитата Сообщение от Просто Саша Посмотреть сообщение
Сразу поймете, что тут не так.
Причём здесь с++ и string? Есть кодировка, где это условие истинно?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 10:26  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Причём здесь с++ и string? Есть кодировка, где это условие истинно?
Ну и что с того?
Значит надо понимать так, что класс string написан исключительно для американцев и англичан?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
18.06.2019, 12:09 6
Цитата Сообщение от Просто Саша Посмотреть сообщение
Ну и что с того?
При сравнении символов сравниваются численные значения их символов. А эти численные значения определяются кодировкой. Ну а по поводу того, почему кириллические символы в
CP866 не по порядку - потому что микропроцессоры изначально разрабатывались в америках, япониях и европах.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 14:01  [ТС] 7
Цитата Сообщение от TRam_ Посмотреть сообщение
При сравнении символов сравниваются численные значения их символов.
Да бросьте Вы, старый допотопный С умеет это делать легко и просто со строками в стиле C и в любой кодировке.
А тут блин создан новый класс, а сравнение объектов сделали на уровне рыбного института, такое ощущение, что классы эти писали дети среднего школьного возраста.
0
146 / 39 / 26
Регистрация: 11.05.2019
Сообщений: 122
18.06.2019, 14:09 8
Просто Саша, а можно пример на старый допотопный С.
Хоть посмотреть что не так с С++. а то мне вот например из темы непонятно.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
18.06.2019, 14:28 9
Цитата Сообщение от Просто Саша Посмотреть сообщение
старый допотопный С умеет это делать легко и просто со строками в стиле C и в любой кодировке
Пример приведите, в частности с этим самым Ё .
0
146 / 39 / 26
Регистрация: 11.05.2019
Сообщений: 122
18.06.2019, 15:49 10
Цитата Сообщение от Просто Саша Посмотреть сообщение
старый допотопный С умеет это делать легко и просто со строками в стиле C и в любой кодировке
унёс тайну с собой
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.06.2019, 15:57 11
Цитата Сообщение от shelluser Посмотреть сообщение
унёс тайну с собой
В допотопном Си наверное кодировка была CP866. Там Ё в конце стоит, поэтому Е - меньше (ну и все остальные тоже)
2
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 18:17  [ТС] 12
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
унёс тайну с собой
Да эта тайна полишинеля, она тока для вас тайна.

C++
1
2
3
4
5
char const* cstr1 {"Ё"};
char const* cstr2 {"Е"};
 
_locale_t loc{ _create_locale(LC_ALL, "ru_RU.1251") };
cout << boolalpha << static_cast<bool>(_strcoll_l(cstr1, cstr2, loc)) << endl;
Говорите кодировка 866, да вот тоже самое в UTF кодировке.

C++
1
2
3
4
5
wchar_t const* wcstr1 {L"Ё"};
wchar_t const* wcstr2 {L"Е"};
 
_locale_t loc{ _create_locale(LC_ALL, "ru_RU.UTF8") };
cout << boolalpha << static_cast<bool>(_wcscoll_l(wcstr1, wcstr2, loc)) << endl;
0
146 / 39 / 26
Регистрация: 11.05.2019
Сообщений: 122
18.06.2019, 18:50 13
так где же пример на С ??

ладно уже сам проверил

https://rextester.com/QLYGF80763


https://rextester.com/TDN21195

Добавлено через 2 минуты
Вывод с++

-1
-1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <locale.h>
#include <cstring>
using namespace std;
int main()
{
    char const* cstr1 {"Ё"};
char const* cstr2 {"Е"};
 
_locale_t loc1{ _create_locale(LC_ALL, "ru_RU.1251") };
cout <<  _strcoll_l(cstr1, cstr2, loc1) << endl;
    
    
    wchar_t const* wcstr1 {L"Ё"};
wchar_t const* wcstr2 {L"Е"};
 
_locale_t loc2{ _create_locale(LC_ALL, "ru_RU.UTF8") };
cout <<  _wcscoll_l(wcstr1, wcstr2, loc2) << endl;
}
Вывод с

-1
-1

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <locale.h>
#include <string.h>
 
int main()
{
    char const* cstr1 ="Ё";
    char const* cstr2 ="Е";
 
   _locale_t loc1= _create_locale(LC_ALL, "ru_RU.1251") ;
    printf("%d\n",_strcoll_l(cstr1, cstr2, loc1));
    
    
    wchar_t const* wcstr1 =L"Ё";
    wchar_t const* wcstr2 =L"Е";
 
   _locale_t loc2 = _create_locale(LC_ALL, "ru_RU.UTF8");
   printf("%d\n", _wcscoll_l(wcstr1, wcstr2, loc2));
    
    
}
Добавлено через 42 секунды
Цитата Сообщение от Просто Саша Посмотреть сообщение
Да эта тайна полишинеля, она тока для вас тайна.
Что же там за тайна ?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 19:15  [ТС] 14
Цитата Сообщение от shelluser Посмотреть сообщение
так где же пример на С ??
Я тоже там проверил и действительно выдает -1, но в нормальной Visual Studio выводится просто 1.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
18.06.2019, 20:18 15
Цитата Сообщение от Просто Саша Посмотреть сообщение
да вот тоже самое в UTF кодировке.
У тебя обрабатываемый файл исходного кода, в котором написаны строки

C
1
2
    char const* cstr1 ="Ё";
    char const* cstr2 ="Е";
в какой кодировке сохранён?

Добавлено через 2 минуты
А в винде по умолчанию используется https://ru.wikipedia.org/wiki/Windows-1251 , там буква Ё стоит перед буквой А . И да, в алфавите Ё стоит таки после Е.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
18.06.2019, 21:47  [ТС] 16
Цитата Сообщение от TRam_ Посмотреть сообщение
У тебя обрабатываемый файл исходного кода, в котором написаны строки
1251
0
18.06.2019, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2019, 21:47
Помогаю со студенческими работами здесь

Сравнение объектов класса
как можно сравнивать обекты класса? если например классу задать какую-нибудь ID-переменную,...

Модификация объектов класса string
ООП С++ Лафоре есть пример: // sstrchng.cpp // изменение частей строки #include &lt;iostream&gt;...

Сравнение двух строк (экземпляры класса string ) задействуя метод compare
Здравствуйте, мне необходимо сравнить два экземпляра класса string, один из экземпляров вводится с...

Преобразование string в Bin и обратно. Русский текст. Пр.облема при Bin=>Str
Доброго времени суток! Пишу клиент-серверное приложение. Есть смысл кодировать информацию в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru