Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
#1

CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t) - C++

08.11.2015, 22:59. Просмотров 652. Ответов 24
Метки нет (Все метки)

Помогите разобраться с кодировками. Получаю из базы данных значения и при выводи их в EditControl все отлично, но если выводить данные в ListView - появляются кракозябры.

http://www.cyberforum.ru/cpp-beginners/thread1523536.html
Получение данных
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                sqlite3 *db; // Init SQLite
            char *errorMsg = 0;
            int rc;
            char *sql;
 
            rc = sqlite3_open(/*getenv("APPDATA") + */ "C:\\Users\\illya05 Studio\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data Copy", &db);
            
            if(rc){ // Error handler
                SendDlgItemMessage(hDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)L"Connection Error!");
            }else{
                SendDlgItemMessage(hDlg, 1002, LB_ADDSTRING, NULL, (LPARAM) L"Success!");
 
                sql = "SELECT password_value, action_url, username_value FROM logins";
                rc = sqlite3_exec(db, sql, callback, 0, &errorMsg);
 
                if(rc != SQLITE_OK){
                    SetDlgItemTextA(hDlg, 1003, (LPCSTR) errorMsg);
                    sqlite3_free(db);
                }else{
                    SendDlgItemMessage(hDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)L"Success Query!");
                }
Вывод на экран
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static int callback(void *notUsed, int argc, char **argv, char **colName){
    int i;
    LVITEM lvi;
    for (i = 0; i < argc; i++){
        // First column
        LVITEM lvi;
        lvi.mask = LVIF_TEXT;
        lvi.pszText = (LPWSTR)colName[i];
        lvi.iItem = SendDlgItemMessage(hDDlg, 1012, LVM_GETITEMCOUNT, 0, 0);
        lvi.iSubItem = 0;
 
        int index = SendDlgItemMessage(hDDlg, 1012, LVM_INSERTITEM, 0, (LPARAM)&lvi);
        if (index != -1) {
            // Second column
            lvi.mask = LVIF_TEXT;
            lvi.pszText = (LPWSTR)argv[i];
            lvi.iItem = index;
            lvi.iSubItem = 1;
            SendDlgItemMessage(hDDlg, 1012, LVM_SETITEM, 0, (LPARAM)&lvi);
        }
    }
    return 0;
}
0
Миниатюры
CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 22:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t) (C++):

Cannot convert from 'wchar_t' to 'const wchar_t *'
такой код, порылся в инете не помогло. ломать голову надоело может кто...

Wchar_t и unsigned wchar_t в windows
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта ...

Error C2664: невозможно преобразовать из "wchar_t" в "const wchar_t *"
Вот так работает: wchar_t buf; Edit_GetText(hE, buf, sizeof(buf)); ...

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'|
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция...

wchar_t
что ето за тип данних: wchar_t скок у нему байт??

24
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
08.11.2015, 23:16 #2
8-я, 16-я строки не верны. Думаешь, от приведения типа у тебя строка преобразуется?
Что в colName? utf-8?
1
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 00:10  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
8-я, 16-я строки не верны. Думаешь, от приведения типа у тебя строка преобразуется?
Я не знаю как их преобразовать. Все уже перепробовал.

Цитата Сообщение от nmcf Посмотреть сообщение
Что в colName? utf-8?
Не уверен точно, лучше исходник скину. Там в папке C:\Users\USER\AppData\Local\Google\Chrome\User Data\Default\Login Data сделайте копию файла Login Data и назовите ее Login Data Copy + Этот путь поменяйте в самой программе -
http://stuzer.link/file_search?id=solution
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 10:32 #4
Нет у меня такого файла, я Chrome не пользуюсь. Просто дамп сделай в отладчике и покажи.
1
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 17:26  [ТС] #5
nmcf, В лс скинул
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 20:49 #6
Лучший ответ Сообщение было отмечено illya05 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static int callback(void *notUsed, int argc, char **argv, char **colName){
    wchar_t buf[10240];
    int i;
    LVITEM lvi;
    //SendDlgItemMessageA(hDDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)argv[0]);
    SetDlgItemTextA(hDDlg, 1003, argv[0]);
 
    for (i = 0; i < argc; i++){
        // First column
        LVITEM lvi;
        lvi.mask = LVIF_TEXT;
        MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, colName[i], strlen(colName[i]) + 1, buf, 10240);
        lvi.pszText = buf;
        //lvi.pszText = (LPWSTR) colName[i];
        lvi.iItem = SendDlgItemMessage(hDDlg, 1012, LVM_GETITEMCOUNT, 0, 0);
        lvi.iSubItem = 0;
 
        int index = SendDlgItemMessage(hDDlg, 1012, LVM_INSERTITEM, 0, (LPARAM) &lvi);
        if(index != -1){
            // Second column
            lvi.mask = LVIF_TEXT;
            MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, argv[i], strlen(argv[i]) + 1, buf, 10240);
            lvi.pszText = buf;
            lvi.iItem = index;
            lvi.iSubItem = 1;
            SendDlgItemMessage(hDDlg, 1012, LVM_SETITEM, 0, (LPARAM) &lvi);
        }
    }
    return 0;
}
1
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:05  [ТС] #7
Спасибо огромное! Очень помогли!

Можно еще 1 вопрос, если не трудно. Как из BYTE* тоже самое сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    DATA_BLOB DataIn;
    DATA_BLOB DataOut;
    DATA_BLOB DataVerify;
 
    BYTE *pbDataInput = (BYTE*)argv[0];
    DWORD cbDataInput = strlen(argv[0]) + 1;
 
    DataIn.pbData = pbDataInput;
    DataIn.cbData = cbDataInput;
 
    //CRYPTPROTECT_PROMPTSTRUCT PromptStruct;
    LPWSTR pDescrOut;
 
    //ZeroMemory(&PromptStruct, sizeof(PromptStruct));
    //PromptStruct.cbSize = sizeof(PromptStruct);
    //PromptStruct.dwPromptFlags = CRYPTPROTECT_PROMPT_ON_PROTECT;
    //PromptStruct.szPrompt = L"This is a user prompt";
 
    if(CryptProtectData(&DataIn, (LPCWSTR)argv[0], NULL, NULL, /*&PromptStruct*/ NULL, 0, &DataOut)){
        SendDlgItemMessage(hDDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)L"The encryption phase worked");
    }
 
    if(CryptUnprotectData(&DataOut, &pDescrOut, NULL, NULL, /*&PromptStruct*/ NULL, 0, &DataVerify)){
        SendDlgItemMessage(hDDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)DataVerify.pbData);
        SetDlgItemText(hDDlg, 1003, (LPCWSTR)DataVerify.pbData);
        SendDlgItemMessage(hDDlg, 1002, LB_ADDSTRING, NULL, (LPARAM)pDescrOut);
    }
    LocalFree(pDescrOut);
    LocalFree(DataOut.pbData);
    LocalFree(DataVerify.pbData);
Вывод - это DataVerify.pbData
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 21:10 #8
Ну точно так же, MultiByteToWideChar() используй и буфер. Только имя исходной строки поменяй на своё.

Вообще-то я не понял, какая там кодировка. Возможно, utf-8, без русского текста не ясно, а английский совпадает с ANSI.
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:14  [ТС] #9
Не могу. Пишет аргумент типа "BYTE *" несовместим с параметром типа "LPCCH"
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 21:17 #10
Ты точно уверен, что там строка? Приведи его к (char *) тогда.
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:25  [ТС] #11
Опять кракозябры. Вот этот код стоит перед циклом for, и получает "password_value".
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 21:45 #12
В каком виде хранятся пароли? Я их не увидел. Там не текстовое поле по-видимому, обычно пароли хранятся в виде хеша.
У тебя есть схема данных? Тип поля "пароль" какой?
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:51  [ТС] #13
Байтовый массив. http://habrahabr.ru/post/134982/
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 22:41 #14
Там C# используют. Может тебе взять их программу?
Так что ты хочешь? Это не текстовая строка, выводить нечего. К тому же у sqlite какой-то мутный способ работы с BLOB.
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 22:48  [ТС] #15
Я хочу расшифровать пароль. Но результат функция CryptUnprotectData() дает в виде структуры DATA_BLOB -> BYTE*
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
09.11.2015, 23:11 #16
Сам BLOB верно считан? Я в той версии вообще такое не вижу.
Вот так, если b - твой BYTE *.
C++
1
2
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (char *)b, strlen((char *)b) + 1, buf, 10240); // ANSI
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, (char *)b, strlen((char *)b) + 1, buf, 10240); // UTF8
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 23:29  [ТС] #17
О, уже хоть что-то выводит. Но...
0
Миниатюры
CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)  
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
10.11.2015, 10:03 #18
CP_UTF8 пробовал?
Выведи байты в шестнадцатеричном виде и посмотри, похоже ли содержимое на текст.
0
illya05
139 / 95 / 47
Регистрация: 03.08.2013
Сообщений: 765
10.11.2015, 12:32  [ТС] #19
А как это сделать? Не работал никогда с этим еще
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
10.11.2015, 14:29 #20
C++
1
2
3
4
    std::wostringstream oss;
    for (int i = 0; DataOut.pbData[i] != 0; ++i)
        oss << std::hex << std::setw(2) << std::setfill(L'0') << (unsigned)DataOut.pbData[i] << L' ';
        wcscpy(buf, oss.str().c_str());
Как ты считываешь BLOB? В каком поле его длина?
0
10.11.2015, 14:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 14:29
Привет! Вот еще темы с решениями:

Wchar_t
подключаюсь к серверу. Присваиваю переменной типа string имя, const char*...

String to wchar_t
День всем добрый. Уже пролазил весь интернет, и ничего не понял. Вся надежда...

String в wchar_t*
Всем доброго времени суток! Вопрос уже изъезжен давно, но я уже 2 недели...

wchar_t в string
Собственно, как можно преобразовать wchar_t* в string?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru