Наконец-то я созрел на переход с обычных строк к юникоду. Но вот беда: не могу разобраться, как сделать так, чтобы русские страницы в кодировке 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
Я вообще то просил код, в котором ты получаешь строку.
> 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 best19.11.09 20:02 Автор: void <Grebnev Valery> Статус: Elderman