Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
[C++] Как правильно получить контент в кодировке UTF-8?  19.11.09 03:51  
 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 | 
 
Наконец-то я созрел на переход с обычных строк к юникоду. Но вот беда: не могу разобраться, как сделать так, чтобы русские страницы в кодировке UTF-8 считывались в "читабльном" виде, а не в виде мусора.
 
 Заменил в своей программе все char'ы на TCHAR'ы, LPSTR/LPCSTR на LPTSTRT/LPCTSTR. Но попрежнему вместо букв вижу мусор. Что делать?
 | 
 
 
  | 
[C++] А почему utf-8?  19.11.09 04:30  
 Автор: amirul <Serge> Статус: The Elderman
 | 
 
> Наконец-то я созрел на переход с обычных строк к юникоду. > Но вот беда: не могу разобраться, как сделать так, чтобы > русские страницы в кодировке UTF-8 считывались в > "читабльном" виде, а не в виде мусора. MultiByteToWideChar
 
 > Заменил в своей программе все char'ы на TCHAR'ы, > LPSTR/LPCSTR на LPTSTRT/LPCTSTR. Но попрежнему вместо букв > вижу мусор. Что делать? Использовать utf-16
 | 
 
 
  |   | 
Пишу "каталогизатор" для blogspot.com, а там всё в кодировке...  19.11.09 05:27  
 Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 19.11.09 05:30  Количество правок: 1
 | 
 
Пишу "каталогизатор" для blogspot.com, а там всё в кодировке UTF-8 записано, поэтому и смотрю в сторону неё.
 
 MultiByteToWideChar пробовал. Вроде работает, но когда пытаюсь вывести строку в MessageBox или сохранить в БД (Access) то мусор получается.
 
 И ещё попутный вопрос: обязательно ли во всей программе строки менять на юникодовские, или можно только в нужной мне части. Например, я загружаю контент страницы в обычную char'овскую строку, а потом нужный кусок перевожу в юникод. Попробовал такую стратегию прикрутить, но пока безуспешно.
 | 
 
 
  |   |   | 
Ответ стандартный. Попробуй почитать документацию  19.11.09 06:40  
 Автор: amirul <Serge> Статус: The Elderman
 | 
 
> Пишу "каталогизатор" для blogspot.com, а там всё в > кодировке UTF-8 записано, поэтому и смотрю в сторону неё. Откуда данные берешь? Загрузил наугад одну из страниц
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 Ни о чем не говорит? В частности "xhtml"?
 
 > MultiByteToWideChar пробовал. Вроде работает, но когда > пытаюсь вывести строку в MessageBox или сохранить в БД > (Access) то мусор получается. Ну давай код уже.
 
 > И ещё попутный вопрос: обязательно ли во всей программе > строки менять на юникодовские, или можно только в нужной Вообще нет, но за ANSI уже пора лишать лицензии. Или взымать акциз какой нибудь, ибо ЗАДОЛБАЛИ.
 
 > мне части. Например, я загружаю контент страницы в обычную > char'овскую строку, а потом нужный кусок перевожу в юникод. В случае с utf8 не забудь синхронизировать поток 
 
 > Попробовал такую стратегию прикрутить, но пока безуспешно. Читай про макросы _UNICODE и UNICODE и то каким образом MessageBox превращается в MessageBoxA/MessageBoxW, а TCHAR - в char/wchar_t
 
 PS: Я тебе по моему уже советовал попробовать писать на шарпе или VB. Серьезно, там таких проблем не возникает - плюсы, похоже, не для тебя.
 | 
 
 
  |   |   |   | 
Код  19.11.09 07:54  
 Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 19.11.09 07:55  Количество правок: 1
 | 
 
Сейчас пока остановился на топоровом варианте, где из юникода тупо русские символы распознаются. Но хотелось бы, чтобы отображались все символы.
 
 
BOOL InsertBlogInDB(LPCSTR lpcszLink2Blog, LPCSTR lpcszTitle, DWORD dwLocale)
{
	SQLHANDLE	hStmt;
	SQLRETURN	ret;
	char		szTitle[SIZE_TITLE];
	char		szQuery[MAXSIZE_QUERYSTR];
	if (0 == lstrcmp(szLikeLocale, "ru"))
	{
		lstrcpy(szTitle, lpcszTitle);
		for (int i = 0, k = 0; szTitle[i]; k ++)
		{
			if (szTitle[i] < 0)
			{
				szTitle[k] = (szTitle[i] + 48) * 64 + szTitle[i + 1] + 48;
				i += 2;
			}
			else
			{
				szTitle[k] = szTitle[i];
				i++;
			}
		}
		szTitle[k] = 0;
	}
	ret = SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt);
	if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
		return FALSE;
	wsprintf(szQuery, "INSERT INTO index (url, title, locale) VALUES ('%s', '%s', %d)", lpcszLink2Blog, szTitle, dwLocale);
	ret = SQLExecDirect(hStmt, (SQLTCHAR *) szQuery, lstrlen(szQuery));
	if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
		return FALSE;
	SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
	return TRUE;
}
 ---
 
 Хотелось бы вместо функции wsprintf поставить какую-нибудь другую функцию. чтобы в szQuery вставилась юникодная строка. Есть такая?
 | 
 
 
  |   |   |   |   | 
Я вообще то просил код, в котором ты получаешь строку.  19.11.09 09:22  
 Автор: amirul <Serge> Статус: The Elderman
 | 
 
Я вообще то просил код, в котором ты получаешь строку.
 
 > 	if (0 == lstrcmp(szLikeLocale, "ru")) > 	{ > 		lstrcpy(szTitle, lpcszTitle); > 		for (int i = 0, k = 0; szTitle[i]; k ++) > 		{ > 			if (szTitle[i] < 0) > 			{ > 				szTitle[k] = (szTitle[i] + > 48) * 64 + szTitle[i + 1] + 48; > 				i += 2; > 			} > 			else > 			{ > 				szTitle[k] = szTitle[i]; > 				i++; > 			} > 		} > 		szTitle[k] = 0; > 	} ^^^^ Что это?!!
 MultiByteToWideChar же!!!
 
 > 	ret = SQLAllocHandle(SQL_HANDLE_STMT, hConn, > &hStmt); > 	if (SQL_SUCCESS != ret && > SQL_SUCCESS_WITH_INFO != ret) > 		return FALSE; 
 > 	wsprintf(szQuery, "INSERT INTO index (url, title, > locale) VALUES ('%s', '%s', %d)", lpcszLink2Blog, szTitle, > dwLocale); Что это? Почему wsprintf-у даешь char[] в качестве буфера? Почему строка формата char[]? Почему аргументы для %s типизированы (char *) в конце концов? Ну, пожалуйста, ну пиши на шарпе, а?
 
 > 	ret = SQLExecDirect(hStmt, (SQLTCHAR *) szQuery, > lstrlen(szQuery)); >  > 	if (SQL_SUCCESS != ret && > SQL_SUCCESS_WITH_INFO != ret) > 		return FALSE; > 	SQLFreeHandle(SQL_HANDLE_STMT, hStmt); >  > 	return TRUE; > } >  --- >  > Хотелось бы вместо функции wsprintf поставить какую-нибудь > другую функцию. чтобы в szQuery вставилась юникодная > строка. Есть такая? Ага, есть. wsprintf
 
 PS: Ну если не шарп, то подумай хотя бы над использованием C++ и ADO вместо ODBC.
 | 
 
 
  |   |   |   |   |   | 
I would use ADO along with C++. But C# is the best  19.11.09 20:02  
 Автор: void <Grebnev Valery> Статус: Elderman
 | 
 
| 
 | 
 
 
  
 
 | 
 |