информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Все любят медПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Шестой Perl превратится в Raku,... 
 Kik закрывается, все ушли на криптофронт 
 Sophos открывает Sandboxie 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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
<"чистая" ссылка>
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach