Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
1

CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)

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

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

Получение данных
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;
}
Миниатюры
CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2015, 22:59
Ответы с готовыми решениями:

Почему const wchar_t* воспринимается как wchar_t* ?
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir);...

Не выходит реализовать wchar_t * -> LONG_PTR -> wchar_t *
как сделать чтобы в строку aa скопировать данные? непойму что я дедаю неправильно wchar_t * aa =...

Преобразовать Multibyte в UTF8
У меня есть фаил строки в котором в кодировке Мультибайт, каким образом их можно преобразовать в...

Ошибка при подключении к XE3 библиотеки для VS: "Please use native wchar_t type (/Zc:wchar_t)"
Господа, пытаюсь прикрутить к билдеру библиотеку для работы с автокадом. К сожалению она жестко...

24
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
08.11.2015, 23:16 2
8-я, 16-я строки не верны. Думаешь, от приведения типа у тебя строка преобразуется?
Что в colName? utf-8?
1
140 / 96 / 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
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
09.11.2015, 10:32 4
Нет у меня такого файла, я Chrome не пользуюсь. Просто дамп сделай в отладчике и покажи.
1
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 17:26  [ТС] 5
nmcf, В лс скинул
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
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
140 / 96 / 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
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
09.11.2015, 21:10 8
Ну точно так же, MultiByteToWideChar() используй и буфер. Только имя исходной строки поменяй на своё.

Вообще-то я не понял, какая там кодировка. Возможно, utf-8, без русского текста не ясно, а английский совпадает с ANSI.
0
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:14  [ТС] 9
Не могу. Пишет аргумент типа "BYTE *" несовместим с параметром типа "LPCCH"
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
09.11.2015, 21:17 10
Ты точно уверен, что там строка? Приведи его к (char *) тогда.
0
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:25  [ТС] 11
Опять кракозябры. Вот этот код стоит перед циклом for, и получает "password_value".
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
09.11.2015, 21:45 12
В каком виде хранятся пароли? Я их не увидел. Там не текстовое поле по-видимому, обычно пароли хранятся в виде хеша.
У тебя есть схема данных? Тип поля "пароль" какой?
0
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 21:51  [ТС] 13
Байтовый массив. http://habrahabr.ru/post/134982/
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
09.11.2015, 22:41 14
Там C# используют. Может тебе взять их программу?
Так что ты хочешь? Это не текстовая строка, выводить нечего. К тому же у sqlite какой-то мутный способ работы с BLOB.
0
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 22:48  [ТС] 15
Я хочу расшифровать пароль. Но результат функция CryptUnprotectData() дает в виде структуры DATA_BLOB -> BYTE*
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
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
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
09.11.2015, 23:29  [ТС] 17
О, уже хоть что-то выводит. Но...
Миниатюры
CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)  
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
10.11.2015, 10:03 18
CP_UTF8 пробовал?
Выведи байты в шестнадцатеричном виде и посмотри, похоже ли содержимое на текст.
0
140 / 96 / 47
Регистрация: 03.08.2013
Сообщений: 765
10.11.2015, 12:32  [ТС] 19
А как это сделать? Не работал никогда с этим еще
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2015, 14:29
Помогаю со студенческими работами здесь

Wchar_t и unsigned wchar_t в windows
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта Вопрос1: используется...

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

Как включить Multibyte regex (oniguruma) version
php 5.3.10 на freeBSD 6.2 сейчас mbstring Multibyte Support enabled Multibyte string engine...

Строка с кириллицей. Ошибка: invalid multibyte char (US-ASCII)
начал изучать руби . вообще я уже знаю немного из этого и других языков , но когда решил всерьёз...

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

wchar_t под linux => wchar_t под windows
Такая проблема. Написал одну программу под windows с использование библиотеки xerces-c. Теперь надо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru