Проблема с русским

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

Короче написал тут небольшую прогу, которая может добавлять и просматривать русские символы верхнего и нижнего регистра в
MySQL 4.1.12. У меня всё работает а у человека которому писал нет. Говорит что вместо буквы "а" допустим, сохраняются '?'. У него стоит ХР у меня тож. Но у меня всё работает . Вот пример моей функции перевода из utf8 и обратно мот здесь ошибки. Поле в Таблица в которую сохраняем char(1) и кодировка utf8_bin. Мот у кого есть какие нить предположения ?

Код: Выделить всё

char* CMySQLBrowserDlg::AnsiToUtf(char* ansi)
{
	ZeroMemory(cvrStr,MAX_PATH);
	WCHAR *wStr=NULL;
	strcpy(cvrStr,ansi);
	int nCountLit = MultiByteToWideChar(CP_ACP, 0, cvrStr, -1, wStr, 0); 
	wStr = new WCHAR[nCountLit];
	MultiByteToWideChar(CP_ACP,0, cvrStr,-1, wStr,nCountLit);
	WideCharToMultiByte(CP_UTF8, 0, wStr, -1, cvrStr, MAX_PATH, NULL, NULL); 
	return cvrStr;
}



char* CMySQLBrowserDlg::UtfToAnsi(unsigned char* utf)
{
	ZeroMemory(cvrStr,MAX_PATH);
	WCHAR* wStr=NULL;
         char *tmp = (char*)utf;
	strcpy(cvrStr,tmp);
	int nCountLit = MultiByteToWideChar(CP_UTF8,0, cvrStr,-1, wStr,0 ); 
	wStr = new WCHAR[nCountLit];
	MultiByteToWideChar(CP_UTF8,0, cvrStr,-1, wStr,nCountLit);
	WideCharToMultiByte(CP_ACP, 0, wStr, -1, cvrStr, MAX_PATH, NULL, NULL); 
	delete wStr;
	return cvrStr;
}
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Чего подразумевается под ANSI? Распространенных кодировок под русский язык несколько - win1251, koi8 и OEM866.
Кодировки созданные чтобы при обрезании старшего бита в бесценных допотопных униксах сохранялась читаемость
либо чтобы сохранить бесценные символы псевдографики для бесценных синеньких рамочек нортон командера должны исчезнуть.

Я всегда хардкодю 1251.
Т.е я бы песал такъ
MultiByteToWideChar(1251, 0, cvrStr,-1, wStr,nCountLit);
2B OR NOT(2B) = FF
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

у меня 4,1,11
конфиг такой:
///////// my.ini
[WinMySQLAdmin]
Server=C:/mysql/bin/mysqld-nt.exe
QueryInterval=3

[mysqld]
# set basedir to installation path, e.g., c:/mysql
basedir=c:/mysql
# set datadir to location of data directory,
# e.g., c:/mysql/data or d:/mydata/data
datadir=E:/data
character-sets-dir=C:/mysql/share/charsets
default-character-set=cp1251

[server]
character-sets-dir=C:/mysql/share/charsets

[client]
character-sets-dir=C:/mysql/share/charsets
/////////////////

после подсоединения к серверу нужно выполнить: set character set utf8;
или set character set cp866; или ещё как-нибудь.

далее всё зависит от программы. Т.е. если " set character set utf8;" то программа должна в кодовой странице cp1251 давать мускулу.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Если ты делал на Visual C, то мой ответ может помочь.
у меня была аналогичная проблема. Дело в том что все символы что ты передаешь в MySql содержатся в 1 байте. Надо подключить Юникод. И воответственно использовать типы для передачи строк или CString или wchar_t к примеру.
подключить его можно легко:
свойства проекта, Linker- Advanced- Entry Point - там напиши wWinMainCRTStartup. По том в файл stdafx.h #define _UNICODE
Ну и приедтся везде программку подправить.... при передаче строк, к примеру не "это строка" а _T("строка")
У меня все заработало
Мужчина должен уметь делать все, кроме как рожать детей и трахаться в задницу.
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

Gelert писал(а):Если ты делал на Visual C, то мой ответ может помочь.
у меня была аналогичная проблема. Дело в том что все символы что ты передаешь в MySql содержатся в 1 байте. Надо подключить Юникод. И воответственно использовать типы для передачи строк или CString или wchar_t к примеру.
подключить его можно легко:
свойства проекта, Linker- Advanced- Entry Point - там напиши wWinMainCRTStartup. По том в файл stdafx.h #define _UNICODE
Ну и приедтся везде программку подправить.... при передаче строк, к примеру не "это строка" а _T("строка")
У меня все заработало
Может ты и прав скоро сообщу :)
Ответить