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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 5.00
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
#1

Чем сконвертировать в русский язык такие крякозябры? - C++

06.02.2011, 16:54. Просмотров 3551. Ответов 23
Метки нет (Все метки)

Чем сконвертировать в русский язык такие крякозябры?

OemToChar не подходит. Я мог бы разные способы перебрать, но кроме OemToChar и CharToOem ничего не знаю. Конкретно в данном случае проблема скорее всего в том, что файл изначально был в виндовой кодировке, но выдал его в utf-8 (или перекодировал), но точно не уверен
0
Миниатюры
Чем сконвертировать в русский язык такие крякозябры?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2011, 16:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем сконвертировать в русский язык такие крякозябры? (C++):

mingw+ WindowsXP+ юникод+ консоль+ русский язык+ Dev-Cpp. Вот надо разобраться со всем этим благолепием - C++
Не слабо нам решить эту проблему? В общем, всё, что ест в гугле я пробовал, бесполезно. Всякие там локали и кодировки. Те, ко искал,...

Русский язык в консоли - C++ Builder
вот я написал программу в консольном окне то что я писал по русски пишет какимито игроглифами как это исправить???:wall:

Русский Язык в программе не отображается - C++ Builder
У меня есть программа: #include <windows.h> #include <iostream> #include <queue> #include <conio.h> #include <cstdio> using...

Русский язык и Range Check Error - C++ Builder
Программа запускается, компилируется, но выскакивает Range Check Error и неверно отображается русские символы в таблице. Написано в C++...

Изменение локализации проекта под русский язык - C++ Builder
У меня при компиляции ехе файла весь текст на украйнском, а мне надо на русском. Помогите исправить. И можно ли потом сразу создать ехе...

Крякозябры в имени пользователя - C++ Builder
Здравствуйте. я в программировании полный ноль. Друг написал для меня программу по очистке некоторых папок. Бьёмся уже которых день. На...

23
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 17:37 #2
Дай-ка сам файлик, поиграюсь
0
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
06.02.2011, 17:50  [ТС] #3
Вотъ.
0
Вложения
Тип файла: rar ccc.rar (473 байт, 38 просмотров)
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 19:40 #4
Собсно даже блокнот распознал текст Кинуть назад доку или в личку?
0
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
06.02.2011, 20:30  [ТС] #5
Да мне надо не конкретно этот текст распознать, мне надо программу написать, которая его в нормальный вид перекодирует. А блокнот как распознал?
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 20:48 #6
MultiByteToWideChar конвертирует из кодировок в Unicode виндовский
это видимо utf-8?
1
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 21:47 #7
Собсно

C++
1
2
    wifstream inputStream("ccc.txt", ios::in);
    wcout << inputStream.rdbuf() << endl;
0
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
06.02.2011, 22:56  [ТС] #8
Нифига не понял.

C++
1
2
AnsiString a = "abc";
AnsiString b = qqq (a);
Что должно быть на месте qqq?

Добавлено через 19 минут
Вроде бы как разобрался. В моём случае надо будет сначала MultiByteToWideChar(CP_UTF8), а потом WideCharToMultiByte(1251)

Добавлено через 5 минут
Нашёл исходник. Взято отсюда. На тут случай, если ссылку сотрут, хотя бы упомяну, что автор - npak

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <windows.h>
#include <stdio.h>
 
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;
}
 
char * unicode_to_1251(wchar_t *unicode_string)
{
    int err;
    char * res;
    int res_len = WideCharToMultiByte(
        1251,               // Code page
        0,                  // Default replacement of illegal chars
        unicode_string,     // Multibyte characters string
        -1,                 // Number of unicode chars is not known
        NULL,               // No buffer yet, allocate it later
        0,                  // No buffer
        NULL,               // Use system default
        NULL                // We are not interested whether the default char was used
        );
    if (res_len == 0) 
    {
        printf("Failed to obtain required cp1251 string length\n");
        return NULL;
    }
    res = calloc(sizeof(char), res_len);
    if (res == NULL) 
    {
        printf("Failed to allocate cp1251 string\n");
        return NULL;
    }
    err = WideCharToMultiByte(
        1251,               // Code page
        0,                  // Default replacement of illegal chars
        unicode_string,     // Multibyte characters string
        -1,                 // Number of unicode chars is not known
        res,                // Output buffer
        res_len,            // buffer size
        NULL,               // Use system default
        NULL                // We are not interested whether the default char was used
        );
    if (err == 0)
    {
        printf("Failed to convert from unicode\n");
        free(res);
        return NULL;
    }
    return res;
}
 
int main(int argc, char ** argv)
{
    char utf8_string[] = "UTF-8 + СЂСѓСЃСЃРєРёР№ текст";
    wchar_t * unicode_string;
    char * cp1251_string;
 
    unicode_string = utf8_to_unicode(utf8_string);
    if (unicode_string == NULL)
    {
        printf("Failed to convert!\n" );
        return 1;
    }
    MessageBoxW(NULL, unicode_string, L"Unicode", 0);
    cp1251_string = unicode_to_1251(unicode_string);
    free(unicode_string);
    if (cp1251_string == NULL)
    {
        printf("Failed to convert from unicode!\n");
        return 2;
    }
    MessageBoxA(NULL, cp1251_string, "CP1251", 0);
    return 0;
}
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 23:09 #9
Evg, по утверждению Manjak'а там и так хорошо выводилось, но даже если там другая кодировка достаточно перевести в wide символы и использовать функции для работы с широкими символами(utf8_to_unicode), не переводя опять в ascii'шные символы
0
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
06.02.2011, 23:17  [ТС] #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
Evg, по утверждению Manjak'а там и так хорошо выводилось
Мне нужно, чтобы не у Manjak'а хорошо выводилось, а у меня и у тех, кто будет моей программой пользоваться.

Цитата Сообщение от alex_x_x Посмотреть сообщение
но даже если там другая кодировка достаточно перевести в wide символы и использовать функции для работы с широкими символами(utf8_to_unicode), не переводя опять в ascii'шные символы
Я толком ничего не понял. Я вообще в этой белиберде традиционно ничего не понимаю. Как обезьяна тупо повторить могу, а как этим делом пользоваться, да ещё и так, чтобы у людей без плясок с бубнами работало - толком не понимаю.

У меня, грубо говоря, получается так:

C++
1
2
AnsiString src = .....;
AnsiString dst = AnsiString (unicode_to_1251 (utf8_to_unicode (src.c_str())));
Можешь выразить свою мысль не словами, а примерно похожим кодом? Потому что я так и не понял, что делать и куда нажимать.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 23:28 #11
Цитата Сообщение от Evg Посмотреть сообщение
MessageBoxW(NULL, unicode_string, L"Unicode", 0);
вот это пример работы с широкими символами
wprintf, wscanf, wstring итп
все это часть стандарта
AnsiString приблуда билдера, судя по гуглу широкосимвольный аналог - WideString
а с билдером не работал, но предполагаю, что должно так работать

WideString dst = WideString ((utf8_to_unicode (src.c_str()));

а правильней так
Цитата Сообщение от Manjak Посмотреть сообщение
wifstream inputStream("ccc.txt", ios::in);
wcout << inputStream.rdbuf() << endl;
C++
1
2
3
4
wifstream inputStream("ccc.txt", ios::in);
wstring wstr;
inputStream >> wstr;
WideString dst = WideString( wstr.c_str() );
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
07.02.2011, 00:04 #12
В файле лежит нормальный UTF-16, в конкретном случае достаточно стандартних С++ классов или сишных функций (на UTF-32 не проверял, любителям линухов придется поднапрячься). Ну, а для нормального разбора файла в формате юникод в нем на начале помещается битовая маска - маркировка содержимого так сказать

Добавлено через 14 минут
Тут можно почитать. По-хорошему, если есть маска - это юникод, нету - анси. Но может кто-то просто так текст поместил в файл - тогда есть статистические методы (например, функция IsTextUnicode)
0
Evg
Эксперт CАвтор FAQ
18040 / 6272 / 428
Регистрация: 30.03.2009
Сообщений: 17,255
Записей в блоге: 28
07.02.2011, 09:12  [ТС] #13
alex_x_x, мне нужен AnsiString, потому как все борландовские компоненты работают именно с ним, а не "правильные" варианты

alex_x_x, Manjak, в последних ваших постах речь идёт о файле. У меня НЕ стоит задача прочитать что-то из файла. У меня стоит задача сконвертировать буффер в памяти, который скачан из сети. В начале поста #8 я ведь именно для этого привёл пример с "qqq", но вы мне упорно отвечаете на вопрос, который я не задавал и игнорируете вопрос, который я задал. По факту полезным оказалось лишь MultiByteToWideChar, потому как появилось то, за что модно зацепиться и вопрос быстро решился через гугл. Всё, что я говорю - это НЕ попытка обо$рать, а призыв к тому, что неплохо бы понять, чего хочет спрашивающий, потому как даже в очень простых вопросах зачастую вижу, что люди пишут совсем не то, о чём спрашивают

Добавлено через 36 минут
Хотя я немного промазал разделом. Думал, что создал тему в разделе Borland, а на самом деле в "C/C++". При таком раскладе получается что надо было бы более явно описать, что требуется решение именно для Borland'а
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
07.02.2011, 16:33 #14
Я уже ответил полностью на вопрос. Если целью является любой кусок данных - нет никакой возможности распознать, разве что статистически разбирать данные (у латинских и русских букв младший байт будет 0, но вот это только справедливо для little-endian систем и для UTF-16). В общем, ты задачу себе поставил неправильно или просто неполное описание дал в теме.

Если целевая система - только винда, то это 100% little-endian UTF-16, т.е. читай предыдущий пост про функцию IsTextUnicode, если же целью является нечто утопическое - не забивай себе голову.
0
Wanee
54 / 54 / 13
Регистрация: 02.02.2011
Сообщений: 434
07.02.2011, 16:35 #15
C++
1
2
3
4
5
6
7
8
#include <locale>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "rus" ;
    cout << "Текст по-русски" << endl;
}
0
07.02.2011, 16:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2011, 16:35
Привет! Вот еще темы с ответами:

русский язык - Visual C++
Народ а подскажите как сделать что бы В Visual C++ в консоьлных приложених распознавал русский язк???

MFC и русский язык - Visual C++
Здравствуйте. Как научить приложение на MFC корректно отображать символы русского языка?.. А то все кнопки вида: ??????

Русский язык В visual C++ 2008 - Visual C++
Собсна подскажите плиз как вместо хело мир по английски написань по руски привет мир! Что-бы беез кораказябр! Очень прошу помочь! Мож...

Английский язык для окна ввода пароля, русский язык для самой системы - Windows 7
собственно, сабж. у меня пароль на английском языке, при включении компьютера по умолчанию стоит русский, соответственно надо переключать...


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

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

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