Форум программистов, компьютерный форум CyberForum.ru

Перевод из string в wstring. Неправильная кодировка - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
04.01.2014, 21:03     Перевод из string в wstring. Неправильная кодировка #1
Здорова господа!

Перевожу строку из string в wstring, в строке русские символы и они выводятся в консоли не крякозябрами а просто палочками. От код:

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 <iostream>
using std::wcout;
using std::cout;
using std::endl;
#include <io.h>
#include <fcntl.h>
#include <Windows.h>
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //setlocale(LC_ALL,"utf-8");
    //setlocale(LC_ALL,"ancII");
    _setmode(_fileno(stdout), _O_U8TEXT);
    _setmode(_fileno(stdin), _O_U8TEXT);
    
    string s="hellow world мазафака.  , да да";
    wstring s2=L"hellow world мазафака.  , да да";
    wstring s1(s.begin(),s.end());
//  cout <<"s1.size()= "<<s1.size()<<" s.size()= "<<s.size()<<endl;
    wcout <<"s1= "<<s1<<L"\n\r";//тут фигня выводиться
    wcout <<"s2= "<<s2<<L"\n\r";//так нормально выводиться
 
    return 0;
}
Как сделать что б символы попадали не крякозябры?

Добавлено через 27 минут
почему крякозябры то ясно, символы то в кодировке ASCII, для того что б записать в wstring нужно сначала строку перевести в utf-8 из ASCII тогда все будет нормально, но как ее перевести? На помощь приходит функция widechartomultibyte()
C++
1
2
3
4
5
6
string result_u = MultiByteToWideChar(CP_ASCII,
        0,
        str,
        -1,
        0,
        0);
CP_ASCII - такого значения нету, как определить синоним для CP_ASCII, ну это например для windows 1251 это 1251, а для CP_ASCII что за синоним будет?

Добавлено через 2 часа 18 минут
Короче добавил 1251 и все перевелось, так что получается что в какой же все таки кодировке строка:
C++
1
string s="hellow world мазафака.  , да да";
???????????

Ну понятно елси 1251 и все заработало, то в 1251. А чож тогда все говорят что в С++ символы в кодировке ASCII??? или в кодировках 1251 и в ASCII русские символы одинаково отображаются? Я ничего непойму. Может быть в кодировке 1251 они потому что у меня м.б. сам файл в кодировке 1251? Да хз. от загадка.

Добавлено через 2 часа 41 минуту
Ладно нету русских символов в ASCII, там только латиница.

Добавлено через 53 секунды
это наверно СП1251, у меня наверно файл с кодом программы находится в сп1251 поэтому и перевелось из нее норм.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 21:03     Перевод из string в wstring. Неправильная кодировка
Посмотрите здесь:

std::string -> std::wstring C++
C++ Перевод из int в string
C++ Из string в wstring
C++ Как правильно перевести std::wstring в std::string ?
C++ Как привести std::wstring к std::string?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2014, 21:07     Перевод из string в wstring. Неправильная кодировка #2
Не зашивайте жестко в исходники строки, зависящие от кодировки... Бардак же будет.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
04.01.2014, 21:27  [ТС]     Перевод из string в wstring. Неправильная кодировка #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Не зашивайте жестко в исходники строки, зависящие от кодировки... Бардак же будет.
А как тогда переводить string в wstring, у меня в строке русские символы вроде полюбом нужно перекодировать?

Без перекодировки русские символы в wstring искажаются. Я не сильно в этом шарю, мне лишь бы правильно работало, а щас как раз правильно заработало, а м.б. и не правильно но работает и все. Нужно наверно было использовать CString это строки из МФС они вроде сами кодировку меняют. перекодируются или хз. , а я пишу в низкоуровневом стиле (велосипед создаю) что неправильно .

Добавлено через 6 минут
У меня заранее известно в какой кодировке текст будет, он будет в сп1251, это я для примера хотел кусок кода потестить, попытаться просто конст строку string перевести в wstring, и затем уже для своей проги написать функцию.

В общем все хорошо работает, спасибо кто помогал чувашня!
IrineK
Заблокирован
04.01.2014, 21:30     Перевод из string в wstring. Неправильная кодировка #4
Цитата Сообщение от ninja2 Посмотреть сообщение
велосипед создаю
Велосипед:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
char* Decode_DOS_to_Win(char * str)
{
    unsigned char *cstr= (unsigned char*) str; // "unsigned" - чтоб избежать предупреждений комп-ра
    for(; *cstr; cstr++)
    {   if(*cstr<128) continue; // не фиг топтаться дальше, если не нужно конвертить!
 
        if(*cstr>=128 && *cstr<=175)
            *cstr+=64;
        else if(*cstr>=224 && *cstr<=239)
            *cstr+=16;
        else if(*cstr==252) // №
            *cstr=185;
        else if(*cstr==240) // Ё, Е с двумя точками - Йо
            *cstr=168;
        else if(*cstr==241) //  Ё, е с двумя точками - йо
            *cstr=184;
        else if(*cstr==242) // Є, украинское Йе
            *cstr=170;
        else if(*cstr==243) // є, украинское йе
            *cstr=186;
        else if(*cstr==244) // Ї, украинское Йи
            *cstr=175;
        else if(*cstr==245) // ї, украинское йи
            *cstr=191;
        else if(*cstr==246) // Ў, беларусская У с хвостиком вверху - черт знает, как читается
            *cstr=161;
        else if(*cstr==247) // ў, беларусская У с хвостиком вверху - черт знает, как читается
            *cstr=162;
        else if(*cstr==248) // знак градуса
            *cstr=176;
        else if(*cstr==250) // маленькая центровая точка
            *cstr=183;
        else
            *cstr='?'; // некий символ, которым заменять несуществующие в CP1251
    }
    return str;
}
 
char* Decode_Win_to_DOS(char * str)
{   unsigned char *cstr= (unsigned char*) str;
    
    for(;*cstr;cstr++)
    {   if(*cstr<128) continue; // не фиг топтаться дальше, если не нужно конвертить!
 
        if(*cstr>=240)
            *cstr-=16;
        else if(*cstr>=192)
            *cstr-=64;
        else if(*cstr==185) // №
            *cstr=252;
        else if(*cstr==168) // Ё, Е с двумя точками - Йо
            *cstr=240;
        else if(*cstr==184) //  Ё, е с двумя точками - йо
            *cstr=241;
        else if(*cstr==170) // Є, украинское Йе
            *cstr=242;
        else if(*cstr==186) // є, украинское йе
            *cstr=243;
        else if(*cstr==175) // Ї, украинское Йи
            *cstr=244;
        else if(*cstr==191) // ї, украинское йи
            *cstr=245;
        else if(*cstr==178) // I, украинское И
            *cstr=73;            // в английскую, т.к. в ДОСе нет
        else if(*cstr==179) // i, украинское и
            *cstr=105;         // в английскую, т.к. в ДОСе нет
        else if(*cstr==161) // Ў, беларусская У с хвостиком вверху - черт знает, как читается
            *cstr=246;
        else if(*cstr==162) // ў, беларусская У с хвостиком вверху - черт знает, как читается
            *cstr=247;
        else if(*cstr==176) // знак градуса
            *cstr=248;
        else if(*cstr==183) // маленькая центровая точка
            *cstr=250;
        else
            *cstr='?'; // некий символ, которым заменять несуществующие в CP1251
    }
    return str;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
04.01.2014, 21:36  [ТС]     Перевод из string в wstring. Неправильная кодировка #5
IrineK, Не ну у тебя функция какаето не та, для перекодировки под виндовс как правило используют функцию MultiByteToWideChar(); просто делаешь двойной перевод от если ты переводишь из дос в сп1251 то нужно с помощью этой функции перевести в utf-8, а затем уже из utf-8 в любую кодировку в данном случае в сп1251, так же наоборот из сп1251 в utf-8, а из utf-8 в дос, так что твое решение это полнейший велосипед, такие переводы я спокойно делаю используя одну функцию MultiBytetoWideChar()? хотя не пробовал, но из koi8-r в сп1251 и из utf-8 легко переводит.
IrineK
Заблокирован
04.01.2014, 21:53     Перевод из string в wstring. Неправильная кодировка #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Я не сильно в этом шарю
В точку.
Yandex
Объявления
04.01.2014, 21:53     Перевод из string в wstring. Неправильная кодировка
Ответ Создать тему
Опции темы

Текущее время: 01:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru