Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
36 / 36 / 0
Регистрация: 24.05.2009
Сообщений: 178
1

Непонятные дела с русскими буквами(опять) при сравнении строк

28.01.2012, 12:00. Показов 1108. Ответов 4
Метки нет (Все метки)

Проблема такая: при сравнении некоторых строк (например, "поцелуй"-"поцелуй") методом String::Compare, получается значение 1. Я что только не пробовал, все равно 1. Вобщем привожу код траев:
C++
1
2
3
4
5
6
7
8
9
10
11
12
CultureInfo^ ci=gcnew CultureInfo("ru-RU");
String^ temp1=ansText->Text;   //значение с формы
String^ temp2=form1->gWordArr->GetPtr()[curIndex]->GetRussian(); //значение с формы, метод возвращает String^, temp1 и temp2 нормально инициализируются, правильными значениями "поцелуй" и "поцелуй"
String^ temp3="поцелуй";
String^ temp4="поцелуй";
int temp5=String::Compare("поцелуй","поцелуй"); //ОК - 0
int temp6=String::Compare(temp3,temp4);          //ОК - 0
int temp7=String::Compare(temp1,temp2);// НЕ ОК - 1
int temp8=String::Compare(temp1,temp2,true,ci);// НЕ ОК - 1
int temp9=String::Compare(temp1,temp2,StringComparison::InvariantCulture);//НЕ ОК - 1
int temp10=String::Compare(temp1,temp2,StringComparison::Ordinal);//НЕ ОК - хз че ваще (1к+)
int temp11=String::Compare(temp1,temp2,StringComparison::CurrentCulture);//НЕ ОК - 1
Но так не со всеми словами. Например для сравнения "король"-"король", все нормально уже тут:
C++
1
int temp7=String::Compare(temp1,temp2);// ОК - 0
без всяких извращений. Вобщем, если знает кто, подскажите, пожалуйста, как нормально поцелуй сравнить, чтобы 0 получился.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2012, 12:00
Ответы с готовыми решениями:

Регистронезависимое сравнение строк с русскими буквами
Необходимо регистронезависимо сравнивать строки string с русскими буквами. Пробовал поиграться с...

Проблемма с русскими буквами при Redirect'e
Есть jsp-страница page_1.jsp, которая выдаёт html, в котором есть ссылка. Нажимая на эту ссылку...

Проблема с русскими буквами при отправке формы.
Проблема, с которой мне раньше никогда не приходилось сталкиваться. Вобщем если человек вводит в...

Проблема при использовании сокетов с русскими буквами.
ДЕЛО В ТОМ ЧТО ПРИ ПЕРДАЧИ ДАННЫХ МЕЖДУ КЛИЕНТОМ И СЕРВЕРОМ ИСПОЛЬЗУЮТСЯ ТАКИЕ ЗАМОРОЧКИ КАК ПОТОКИ...

4
Комп_Оратор)
Эксперт по математике/физике
8722 / 4452 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
28.01.2012, 17:24 2
C++
1
String^ temp1=ansText->Text; //значение с формы String^ temp2=form1->gWordArr->GetPtr()[curIndex]->GetRussian(); //значение с формы, метод возвращает String^, temp1 и temp2 нормально инициализируются, правильными значениями "поцелуй" и "поцелуй"
Это Ваши объекты и мне трудно сказать что такое ansText или gWordArr.
String^ нормально поддерживает оператор = если левый и правый операнд String^ причем так как это всегда бывает с адресными выражениями. Конструктор насколько мне известно не вызывается.
Т.е. мой совет - создайте строки используя конструктор, посмотрите что в них и попробуйте сравнить. Может поможет
0
36 / 36 / 0
Регистрация: 24.05.2009
Сообщений: 178
28.01.2012, 21:30  [ТС] 3
Неважно ведь что это за объекты, главное что возвращает используемый метод. А он, как я писал, возвращает String^, которым строки нормально инициализируются (все равно на всякий случай попробовал через конструктор, как и ожидал - ничего не изменилось). Проблема именно в сравнении. Если инициализировать строки значением с одного элемента, то все нормально - 0. Но если одинаковыми значениями с разных элементов ("поцелуй" у обоих, по крайней мере, в дебаггере все выглядит абсолютно одинакого, возможно они как то отличаются по внутренней структуре и из-за этого так странно сравниваются), то начинаются какие-то необъяснимые глюки.
0
Комп_Оратор)
Эксперт по математике/физике
8722 / 4452 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
28.01.2012, 21:55 4
Не могу сказать точно в Вашем случае, почему я уже сказал,
но бывает, что важно. Возвращать можно, что угодно, но если используются неявные преобразования например то результат может быть разный. Например строка полученная из файла зависит от кодировки... и.т.п.
Советую, но не настойчиво - Проанализируйте свои источники, приведите к одному типу например массивам Char[], гляньте что в них, используйте конструкторы сток, сравните.
1
36 / 36 / 0
Регистрация: 24.05.2009
Сообщений: 178
28.01.2012, 22:26  [ТС] 5
Все, проблема вроде решена. Перевел строки в std::string и оказалось что у 2ой строки в индексе 0 стоит непонятный символ '' с кодом 9 (0хС9 в ascii, насколько я смог понять по кодам других символов), который отображался только если развернуть строку. Не знаю откуда он там взялся (тем более берется он еще и не у всех слов - у "поцелуй" - есть, у "король" - нет), но если выкинуть 0 индекс из сравнения для 2 строки, то все норм.

Добавлено через 31 минуту
Жесть как я протупил У меня в файле, откуда слова берутся просто таб стоял, и из за него все беды(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2012, 22:26

Возникает ошибка при работе с русскими буквами
Помогите разобраться что не правильно в программе. Программа принимает строку, потом перебирает...

проблема с русскими буквами при использовании метода navigate()
Файл jsp строит html-документ, в котором имеется форма, на которой есть текстовое поле и селект. На...

Не пишет русскими буквами в VS при написании приложений под Windows
Проблема заключается в следующем В VS при написании приложений под Windows в одном единственном...

При вводе имени и фамилии русскими буквами количество символов увеличивается в 2 раза
При вводе имени и фамилии английскими буквами все работает нормально. Но при вводе имени и фамилии...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru