Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

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

04.01.2014, 21:03. Показов 3341. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова господа!

Перевожу строку из 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 поэтому и перевелось из нее норм.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2014, 21:03
Ответы с готовыми решениями:

Перевод string в wstring
В проекте требуется перевод строк из string в wstring, я использую такую вот конструкцию, но данная конструкция не позволяет переводить...

Перевод строк std::string, std::wstring в Unicode (String)
Собственно столкнулся с проблемой, как корректно перевести к примеру текст из Edit1-&gt;Text в std::string или std::wstring и...

Из string в wstring
Как можно получить wstring-строку из string-строки? (символы в строке латинские, поэтому проблем вроде бы возникать не должно)

5
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.01.2014, 21:07
Не зашивайте жестко в исходники строки, зависящие от кодировки... Бардак же будет.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
04.01.2014, 21:27  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Не зашивайте жестко в исходники строки, зависящие от кодировки... Бардак же будет.
А как тогда переводить string в wstring, у меня в строке русские символы вроде полюбом нужно перекодировать?

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

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

В общем все хорошо работает, спасибо кто помогал чувашня!
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
04.01.2014, 21:30
Цитата Сообщение от 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;
}
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
04.01.2014, 21:36  [ТС]
IrineK, Не ну у тебя функция какаето не та, для перекодировки под виндовс как правило используют функцию MultiByteToWideChar(); просто делаешь двойной перевод от если ты переводишь из дос в сп1251 то нужно с помощью этой функции перевести в utf-8, а затем уже из utf-8 в любую кодировку в данном случае в сп1251, так же наоборот из сп1251 в utf-8, а из utf-8 в дос, так что твое решение это полнейший велосипед, такие переводы я спокойно делаю используя одну функцию MultiBytetoWideChar()? хотя не пробовал, но из koi8-r в сп1251 и из utf-8 легко переводит.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
04.01.2014, 21:53
Цитата Сообщение от ninja2 Посмотреть сообщение
Я не сильно в этом шарю
В точку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2014, 21:53
Помогаю со студенческими работами здесь

utf8 string to wstring
Здравствуйте, уважаемые резиденты форума и знатоки C++! Вопрос новичка к вам, помогите, пожалуйста. Дано: OC: Ubuntu 10.04 ...

Преобразование из String ^ в wstring
Как? В гугле нет ничего толкового.

Сконвертировать string в wstring
Люди подскажите пожалуйста как правильно сконвертировать string с кириллицей в wstring т.е std::string str = &quot;Привет мир&quot;;...

Корректен ли каст из string в wstring?
Доброго вечера. Вот кусок кода: template&lt; typename char_type &gt; string_t&lt;char_type&gt; make_string( const...

Wstring to string как конвертировать
wstring to string как конвертировать Есть текст типа wstring s=&quot;fdgd123 2133&quot; как его переделать в string


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru