0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
1

MessageBox выводит вместо русских символов иероглифы

02.04.2016, 17:24. Показов 5223. Ответов 11
Метки нет (Все метки)

Пробовал переключать юникод, пробовал подключать <Tchar.h>. И MessageBoxW, тоже не помогает.
Итог один либо выводит шифр в MessageBox, либо не может перевести char в LPCSTR или в LPCWSTR.
вот код который я пробую.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpen("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrl(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    MessageBox(HWND_DESKTOP, buffer, "", 0);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2016, 17:24
Ответы с готовыми решениями:

Вместо надписи иероглифы в заголовке окна
Добрый вечер, в программе в заголовке окна вместо нужной записи пишутся иероглифы, может кто нибудь...

Выводятся иероглифы вместо нормального текста
Здравствуйте! Решил слезть с .Net'а и немного разобраться с MFC. В интернете нашел 2 способа...

Чтение файла: иероглифы вместо данных
Открываю файл вот таким кодом stringw strbuff; int numbytes = 0; long HTTPBUFLEN = 1000L; ...

Выводит иероглифы вместо русских букв
Здравствуйте! Вместо 'Привет Мир!' выводит � � � � � � � � � � � ! Подскажите... $str = 'Привет...

11
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 17:53 2
Вам нужен MessageBoxW, а для этого нужно из char* сделать wchar_t*:

C++
1
2
3
size_t uSize = strlen(buffer) + 1;
wchar_t* wcsBuffer = new wchar_t[uSize];
mbstowcs(wcsBuffer, buffer, uSize);
И далее вызвать MessageBoxW:
C++
1
MessageBoxW(HWND_DESKTOP, wcsBuffer, L"", 0);
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
02.04.2016, 18:19  [ТС] 3
Я только начинаю изучать C++
написал так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
size_t uSize = strlen(buffer) + 1;
wchar_t* wcsBuffer = new wchar_t[uSize];
mbstowcs(wcsBuffer, buffer, uSize);
DWORD readd = 0;
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpen("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrl(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    MessageBoxW(HWND_DESKTOP, wcsBuffer, L"", 0);
    return 0;
}
ошибка error C2664: "int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)": невозможно преобразовать аргумент 3 из "const char [1]" в "LPCWSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 18:38 4
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
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#include <stdlib.h>
#include <wchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpen("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrl(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    size_t uSize = strlen(buffer) + 1;
    wchar_t* wcsBuffer = new wchar_t[uSize];
    mbstowcs(wcsBuffer, buffer, uSize);
    MessageBoxW(HWND_DESKTOP, wcsBuffer, L"", 0);
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
02.04.2016, 18:45  [ТС] 5
Cuellius , это должно работать? дело в том что ошибка осталась :/

error C2664: "int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)": невозможно преобразовать аргумент 3 из "const char [1]" в "LPCWSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 19:16 6
У меня все работает. Какой компилятор, версия, параматры компиляции?
Можно попробовать так:
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
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#include <stdlib.h>
#include <wchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpen("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrl(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    size_t uSize = strlen(buffer) + 1;
    wchar_t* wcsBuffer = new wchar_t[uSize];
    mbstowcs(wcsBuffer, buffer, uSize);
    wchar_t wcsCaption[10];
    wcsCaption[0] = 0;
    MessageBoxW(HWND_DESKTOP, wcsBuffer, wcsCaption, 0);
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
02.04.2016, 20:06  [ТС] 7
все же не работает
ошибка другая

Код
error C4996: 'mbstowcs': This function or variable may be unsafe. Consider using mbstowcs_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\programs\microsoft visual studio 12.0\vc\include\stdlib.h(528): см. объявление "mbstowcs"
Visual studio 2013
версия 12.0.210051.1 REL

параметры стандартные

Добавлено через 15 минут
да забыл сказать, юникод поставил не заданным, такая ошибка в коде и из поста№6 и в коде поста № 4.

Добавлено через 13 минут
до инклудов написал #define _CRT_SECURE_NO_WARNINGS

ошибки нет, но и русских символов тоже. Вроде символы поменялись, но все равно зашифрованны.
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 20:23 8
Цитата Сообщение от MIHAnik22 Посмотреть сообщение
параметры стандартные
Так у вас включен SDL (Security Develop Lifecycle), его надо отключить в настройках проекта (Да и вообще, всегда его отключайте!):
Project Properties (1) -> Configuration Properties (2) > C/C++ (3) > General (4) > SDL checks (5) [поставьте No]

Картинка для пояснения:
Миниатюры
MessageBox выводит вместо русских символов иероглифы  
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 20:28 9
Цитата Сообщение от MIHAnik22 Посмотреть сообщение
ошибки нет, но и русских символов тоже. Вроде символы поменялись, но все равно зашифрованны.
Я посмотрел, там используется кодировка UTF-8, её нужно перевести в юникод.

Добавлено через 3 минуты
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
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#include <stdlib.h>
#include <wchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpenA("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrlA(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    size_t uSize = strlen(buffer) + 1;
    wchar_t* wcsBuffer = new wchar_t[uSize << 1];
    MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wcsBuffer, uSize << 1);
    MessageBoxW(HWND_DESKTOP, wcsBuffer, L"", 0);
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
02.04.2016, 20:42  [ТС] 10
Cuellius, спасибо!) продвигаюсь потехоньку)
нашел функцию для преобразования utf8_to_unicode(char *utf8_string) где используется MultiByteToWideChar . Использовал в коде.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#include <stdlib.h>
#include <wchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
 
wchar_t * utf8_to_unicode(char *utf8_string)
{
    int err;
    wchar_t * res;
    int res_len = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        NULL,               // No buffer yet, allocate it later
        0                   // No buffer
        );
    if (res_len == 0)
    {
        printf("Failed to obtain utf8 string length\n");
        return NULL;
    }
    res = calloc(sizeof(wchar_t), res_len);
    if (res == NULL)
    {
        printf("Failed to allocate unicode string\n");
        return NULL;
    }
    err = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        res,                // Output buffer
        res_len             // buffer size
        );
    if (err == 0)
    {
        printf("Failed to convert to unicode\n");
        free(res);
        return NULL;
    }
    return res;
}
 
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpen("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrl(hInetOpen, "https://google.ru/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    size_t uSize = strlen(buffer) + 1;
    wchar_t* wcsBuffer = new wchar_t[uSize];
    mbstowcs(wcsBuffer, buffer, uSize);
    MessageBoxW(HWND_DESKTOP, utf8_to_unicode(wcsBuffer), L"", 0);
    return 0;
}
лезут ошибки
error C2440: =: невозможно преобразовать "void *" в "wchar_t *"
1> Для преобразования "void*" к указателю на тип, не являющемуся "void", требуется явное приведение
1>код.cpp(66): error C2664: "wchar_t *utf8_to_unicode(char *)": невозможно преобразовать аргумент 1 из "wchar_t *" в "char *"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>код.cpp(66): error C2660: MessageBoxW: функция не принимает 3 аргументов
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
02.04.2016, 22:46 11
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
#include <Tlhelp32.h>
#include <conio.h>
#include <Tchar.h>
#include <stdlib.h>
#include <wchar.h>
#pragma comment(lib, "wininet.lib")
 
HINTERNET hInetOpen = 0;
HINTERNET hInetOpenUrl = 0;
char buffer[64000];
DWORD readd = 0;
 
wchar_t * utf8_to_unicode(char *utf8_string)
{
    int err;
    wchar_t * res;
    int res_len = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        NULL,               // No buffer yet, allocate it later
        0                   // No buffer
        );
    if (res_len == 0)
    {
        printf("Failed to obtain utf8 string length\n");
        return NULL;
    }
    res = (wchar_t*)calloc(res_len + 1, sizeof(wchar_t)); //сначала сколько, затем размер, на всякий случай +1 к размеру юникодной строки
    if (res == NULL)
    {
        printf("Failed to allocate unicode string\n");
        return NULL;
    }
    err = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        res,                // Output buffer
        res_len             // buffer size
        );
    if (err == 0)
    {
        printf("Failed to convert to unicode\n");
        free(res);
        return NULL;
    }
    return res;
}
 
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    hInetOpen = InternetOpenA("c:\\totalcmd\\totalcmd\\totalcmd.exe", INTERNET_OPEN_TYPE_DIRECT, 0, 0, NULL);
    hInetOpenUrl = InternetOpenUrlA(hInetOpen, "https://geektimes.ru/post/273226/", 0, 3, INTERNET_FLAG_EXISTING_CONNECT, 0);
    InternetReadFile(hInetOpenUrl, buffer, sizeof(buffer), &readd);
    MessageBoxW(HWND_DESKTOP, utf8_to_unicode(buffer), L"", 0); //мы получаем buffer - строку utf-8, и именно ЕЁ мы должны перевести в юникод
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 13
02.04.2016, 23:00  [ТС] 12
Cuellius, Ё МОЁ!)) Работает!)) Так надо разобраться в коде, но уже могу сказать СПАСИБО БОЛЬШОЕ!!!! НУ ОГРОМНОЕ ПРОСТО!))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2016, 23:00
Помогаю со студенческими работами здесь

В geany (.pas) вместо русских букв выводит иероглифы
Доброе утро/вечер. Я новичок в ОС Ubuntu, вкратце опишу проблему. Поставил IDE geany, для более...

Вместо русских символов отображаются иероглифы
Здравствуйте! Помогите решить проблему с отображением русских символов. Раньше работал на Adobe...

Иероглифы �, вместо русских символов
Загрузил темплейт utf-8, на DLE 10.2 UTF-8, появляются иероглифы, но не везде, лазил по форуму,...

Иероглифы вместо русских символов. (UTF8 не помогает)
Иероглифы вместо русских символов. (UTF8 не помогает) Версия dle: 9.5 Шаблон: Envisioned...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru