Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2011, 19:58   #1
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
По умолчанию сравнение строк с разной кодировкой

Доброго всем времени суток!

Ситуация такая: из файла загружается быза данных, с клавиатуры вводится слово для поиска и ищется в базе. Проблема в том, что даже если вводишь слово, которое заведомо есть, программа его не находит!
Решила, что проблема в кодировке, и испытала почти всевозможные варианты setlocale() - ничего не помогает!

Что же делать???
Работаю в Visual Studio 2008 (если это важно).
HelenSecuriter вне форума Ответить с цитированием
Старый 20.06.2011, 20:27   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а кто мешает ручками перевести в нужную кодировку?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2011, 20:52   #3
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Сперва переводишь одну строку в кодировку другой, а потом сравниваешь их, должно работать.
WebbMan вне форума Ответить с цитированием
Старый 20.06.2011, 23:06   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

отсюда мораль: храните текст в правильной кодировке. Вот Unicode (-8, -16) - правильная кодировка.
Rififi вне форума Ответить с цитированием
Старый 21.06.2011, 10:42   #5
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
По умолчанию

Вот код, который по идее должен сравнивать строки, но даже после применения функции OemToChar он не работает, хотя содержимое файлов а и б одинаковое!
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <windows.h>
using namespace std;

int main(){
	setlocale(0,"");
	ifstream fi1("d:\\iofiles\\a.txt");	//в файле находится слово "кириллица"
	ofstream fo("d:\\iofiles\\b.txt");	//для проверки правильности перекодировки
	string wordin,wordout;
	cin >> wordout;						//ASCII
	fi1 >> wordin;
	char* tmp=new char[wordout.size()+1];
	OemToChar(wordout.c_str(),(LPWSTR)tmp);
	wordout=tmp;
	if (wordin==wordout)cout << "Yra!!!\n";else cout << "Oh, no!!!\n";
	fo << wordout;
	cin.get();cin.get();
	return 0;
}
HelenSecuriter вне форума Ответить с цитированием
Старый 21.06.2011, 11:22   #6
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Не пробовал использовать функцию strcmp(string1,string2); // - сравнивает строки без учета регистра.
WebbMan вне форума Ответить с цитированием
Старый 21.06.2011, 11:23   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какая кодировка в базе данных?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 16:56   #8
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
По умолчанию

Базу тоже из файла читаю, поэтому ANSI.

Цитата:
Сообщение от WebbMan Посмотреть сообщение
Не пробовалA использовать функцию strcmp(string1,string2); // - сравнивает строки без учета регистра.
strcmp сравнивате char* строки, а у меня тип string, для которого проверка на равенство - вполне корректная операция.
там в коде у меня ошибка, нет нуль-символа, но если его поставить,то в выходном файле белиберда получается
Цитата:
char* tmp=new char[wordout.size()+1];
tmp[wordout.size()]=NULL;

Последний раз редактировалось Stilet; 24.07.2011 в 20:52.
HelenSecuriter вне форума Ответить с цитированием
Старый 01.07.2011, 23:25   #9
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Так работает
Код:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <locale>

using namespace std;

int main(int argc, char *argv[])
{
	//setlocale(0, "C");

	ifstream fi1("d:\\iofiles\\a.txt"); //в файле находится слово "кириллица"
	ofstream fo("d:\\iofiles\\b.txt");	//для проверки правильности перекодировки
	string wordin;
        string wordout;

	cin >> wordout;						//ASCII
	fi1 >> wordin;

	char *tmp = new char[wordout.size() + 1];

	OemToCharA(wordout.c_str(), tmp);  //(!!!)

	wordout = tmp;

	if (wordin == wordout)
           cout << "Yra!!!\n";
        else
           cout << "Oh, no!!!\n";

	fo << wordout;

	cin.get();
        cin.get();

	return 0;
}
Обратите внимание на следущий фрагмент:
Код:
bool OemToCharA(LPCSTR *lpszSrc, LPSTR *lpszDst);

bool OemToCharW(LPCSTR *lpszSrc, LPWSTR *lpszDst);

#define LPWSTR *widechar_t;
#define LPSTR *char;
#define OemToChar OemToCharW;
Не ту функцию использовали. Используя заочно OemToCharW, где в качестве второго аргумента ожидается указатель на unicode строку, вы принудительно преобразуете указатель на char к указателю на wchar_t, получаете неправильный результат, но в правильной кодировке ))).

Последний раз редактировалось Dogmat; 01.07.2011 в 23:32.
Dogmat вне форума Ответить с цитированием
Старый 24.07.2011, 19:58   #10
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
По умолчанию

Да, спасибо, все теперь действительно работает!)))
HelenSecuriter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк в С++ Китти Общие вопросы C/C++ 2 12.10.2010 16:56
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52
сравнение строк разной длины Ks2010 Общие вопросы Delphi 2 13.07.2010 12:46
С++. Сравнение строк maxlav Помощь студентам 8 25.06.2009 04:33
Помогите с записью строк в фаил с кодировкой UTF-8 Виталий Серов Общие вопросы Delphi 1 26.03.2009 03:22