Перекодировка UTF8 => 1251
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 16.01.08 10:05
Оценка:
Приветствую, уважаемые!

Сломал мозг, поскольку нижеприведенный код на одной машине (к сожалению, пощупать ее возможности нет) выдает вопросики вместо нормально перекодированного текста.

Убил у английской WinXP везде где можно русский язык, оставил только страницу 1251 в доступных страницах кодировок — работает нормально.

В чем может быть проблема?

CAtlString UTF8Decode(CAtlString& from)
{
    CAtlString result;
    UINT cp = CP_UTF8;

    int wbuflen = MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, from.GetBuffer(), -1, NULL, 0);

    if(wbuflen == 0 && ERROR_NO_UNICODE_TRANSLATION == GetLastError())
    {
        // no UTF-8 string
        cp = 1251;
        wbuflen = MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, from.GetBuffer(), -1, NULL, 0);
    }

    WCHAR * wbuf = new WCHAR[wbuflen];
    int buflen = MultiByteToWideChar(cp,0,from.GetBuffer(),-1,wbuf,wbuflen);

    if(buflen == wbuflen)
    {
        buflen = WideCharToMultiByte(1251, 0, wbuf, -1, NULL, 0,NULL,NULL);

        TCHAR* buf = new TCHAR[buflen];
        WideCharToMultiByte(1251, 0, wbuf, -1, buf, buflen,NULL,NULL);

        result = buf;
        delete [] buf;
    } // if(buflen == wbuflen)
    
    delete [] wbuf;

    return result;
}


В общем, голова уже пухнет немного, т.к. не знаю, что и предположить. Может, проглядел чего?

З.Ы. Код вызывается из BHO в контексте IE, если это важно.
<< Существует и лучший мир, но там все очень дорого. >>
Re: Перекодировка UTF8 => 1251
От: Андрей Россия  
Дата: 16.01.08 12:33
Оценка:
Здравствуйте, Flamer, Вы писали:

skip

а чем макросы типа CW2A не устраивают?
нафига такой огород городить?

или они с UTF8 не работают?

ps насколько я понимаю, ты ATL пользуешь, а не голый WinAPI
Re[2]: Перекодировка UTF8 => 1251
От: llirik  
Дата: 16.01.08 15:31
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Здравствуйте, Flamer, Вы писали:


А>skip


А>а чем макросы типа CW2A не устраивают?

А>нафига такой огород городить?

А>или они с UTF8 не работают?


А>ps насколько я понимаю, ты ATL пользуешь, а не голый WinAPI


CW2A даст 1251 ?
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re: Перекодировка UTF8 => 1251
От: rus blood Россия  
Дата: 16.01.08 15:38
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Приветствую, уважаемые!


F>Сломал мозг, поскольку нижеприведенный код на одной машине (к сожалению, пощупать ее возможности нет) выдает вопросики вместо нормально перекодированного текста.

F>Убил у английской WinXP везде где можно русский язык, оставил только страницу 1251 в доступных страницах кодировок — работает нормально.


А шрифты нужные на машине есть?
Имею скафандр — готов путешествовать!
Re: Перекодировка UTF8 => 1251
От: rus blood Россия  
Дата: 16.01.08 15:45
Оценка:
Здравствуйте, Flamer, Вы писали:

Проект юникодный?
А то пользуешься TCHAR-ом, а _UNICODE не фигурирует...
Имею скафандр — готов путешествовать!
Перекодировка UTF8 => 1251
От: rus blood Россия  
Дата: 16.01.08 15:58
Оценка: 40 (2)
#Имя: FAQ.atl.Utf8To1251
Здравствуйте, llirik, Вы писали:

А>>а чем макросы типа CW2A не устраивают?

А>>нафига такой огород городить?

L>CW2A даст 1251 ?


ATL::CW2CT((LPCWSTR)ATL::CT2CW(szText, CP_UTF8), 1251);
Имею скафандр — готов путешествовать!
Re[2]: Перекодировка UTF8 => 1251
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 16.01.08 23:37
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Проект юникодный?

RB>А то пользуешься TCHAR-ом, а _UNICODE не фигурирует...

Проект не юникодный, но TCHAR на этот всякий случай как раз.
<< Рабство не отменено — оно сменилось 8-часовым рабочим днем. >>
Re[2]: Перекодировка UTF8 => 1251
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 16.01.08 23:37
Оценка:
Здравствуйте, rus blood, Вы писали:


RB>А шрифты нужные на машине есть?


IE показывает русские страницы нормально, т.е. имхо шрифты есть.
<< Если гора идет к тебе, спасайся: это обвал. >>
Re[3]: Перекодировка UTF8 => 1251
От: rus blood Россия  
Дата: 17.01.08 07:58
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Проект не юникодный, но TCHAR на этот всякий случай как раз.

Если этот "всякий случай" наступит, на вход MultiByteToWideChar поступят wide chars, а не MB...

Можно сделать выгрузку в dump hex-значений строк, до и после перекодирования, и сравнить их на разных машинах.
Имею скафандр — готов путешествовать!
Re[4]: Перекодировка UTF8 => 1251
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 17.01.08 15:33
Оценка:
Здравствуйте, rus blood, Вы писали:


F>>Проект не юникодный, но TCHAR на этот всякий случай как раз.

RB>Если этот "всякий случай" наступит, на вход MultiByteToWideChar поступят wide chars, а не MB...

Это я вполне понимаю, спасибо. Тут скорее дело привычки, поправлю, если надо будет, хотя я уже вполне обошелся вашим вариантом, за него отбельное спасибо.

RB>Можно сделать выгрузку в dump hex-значений строк, до и после перекодирования, и сравнить их на разных машинах.


Спасибо, это мысль.
<< Если гора идет к тебе, спасайся: это обвал. >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.