Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Код 19.11.09 07:54 Число просмотров: 2844
Автор: 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 вставилась юникодная строка. Есть такая?
|
<programming>
|
[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
|
|
|
|