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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 5.00
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
#1

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

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

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

OemToChar не подходит. Я мог бы разные способы перебрать, но кроме OemToChar и CharToOem ничего не знаю. Конкретно в данном случае проблема скорее всего в том, что файл изначально был в виндовой кодировке, но выдал его в utf-8 (или перекодировал), но точно не уверен
Миниатюры
Чем сконвертировать в русский язык такие крякозябры?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2011, 16:54     Чем сконвертировать в русский язык такие крякозябры?
Посмотрите здесь:
Visual C++ русский язык
Русский язык C++
C++ Русский Язык!!!
русский язык C++
Русский язык в Си C++
C++ Русский язык
Русский язык C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 17:37     Чем сконвертировать в русский язык такие крякозябры? #2
Дай-ка сам файлик, поиграюсь
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
06.02.2011, 17:50  [ТС]     Чем сконвертировать в русский язык такие крякозябры? #3
Вотъ.
Вложения
Тип файла: rar ccc.rar (473 байт, 38 просмотров)
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 19:40     Чем сконвертировать в русский язык такие крякозябры? #4
Собсно даже блокнот распознал текст Кинуть назад доку или в личку?
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
06.02.2011, 20:30  [ТС]     Чем сконвертировать в русский язык такие крякозябры? #5
Да мне надо не конкретно этот текст распознать, мне надо программу написать, которая его в нормальный вид перекодирует. А блокнот как распознал?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 20:48     Чем сконвертировать в русский язык такие крякозябры? #6
MultiByteToWideChar конвертирует из кодировок в Unicode виндовский
это видимо utf-8?
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;
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
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;
}
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 23:09     Чем сконвертировать в русский язык такие крякозябры? #9
Evg, по утверждению Manjak'а там и так хорошо выводилось, но даже если там другая кодировка достаточно перевести в wide символы и использовать функции для работы с широкими символами(utf8_to_unicode), не переводя опять в ascii'шные символы
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
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())));
Можешь выразить свою мысль не словами, а примерно похожим кодом? Потому что я так и не понял, что делать и куда нажимать.
alex_x_x
бжни
2445 / 1650 / 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() );
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
07.02.2011, 00:04     Чем сконвертировать в русский язык такие крякозябры? #12
В файле лежит нормальный UTF-16, в конкретном случае достаточно стандартних С++ классов или сишных функций (на UTF-32 не проверял, любителям линухов придется поднапрячься). Ну, а для нормального разбора файла в формате юникод в нем на начале помещается битовая маска - маркировка содержимого так сказать

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

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

Добавлено через 36 минут
Хотя я немного промазал разделом. Думал, что создал тему в разделе Borland, а на самом деле в "C/C++". При таком раскладе получается что надо было бы более явно описать, что требуется решение именно для Borland'а
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, если же целью является нечто утопическое - не забивай себе голову.
Wanee
53 / 53 / 13
Регистрация: 02.02.2011
Сообщений: 427
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;
}
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
07.02.2011, 16:40     Чем сконвертировать в русский язык такие крякозябры? #16
Цитата Сообщение от Wanee Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
#include <locale>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "rus" ;
    cout << "Текст по-русски" << endl;
}

Не по теме:

На нас неожиданно снизошло просветление

ForEveR
07.02.2011, 19:29
  #17

Не по теме:

Manjak, Мало того, на него снизошло еще и неверное просветление)

Kronex
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 9
10.02.2011, 12:06     Чем сконвертировать в русский язык такие крякозябры? #18
вот здесь давно все разобрали
ну и вот здесь
хватит в пустую темы создавать при чем с таким заголовком - просто ищите. все такие мелие темы уже давно разобрали. так и искать нужное проще будет
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
10.02.2011, 12:15  [ТС]     Чем сконвертировать в русский язык такие крякозябры? #19
Цитата Сообщение от Kronex Посмотреть сообщение
вот здесь давно все разобрали
ну и вот здесь
хватит в пустую темы создавать при чем с таким заголовком - просто ищите. все такие мелие темы уже давно разобрали. так и искать нужное проще будет
Для начала прочти выданные тобой ссылки и вникни в то, что там написано. А потом вникни в первый пост данной темы. Если всё равно не понятно, то для самых умных специально написал "OemToChar не подходит".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 13:25     Чем сконвертировать в русский язык такие крякозябры?
Еще ссылки по теме:
Русский язык в C++ C++
Русский язык C++ Linux
Русский язык C++
C++ русский язык
C++ Strcpy c++ русский язык

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

Или воспользуйтесь поиском по форуму:
Kronex
0 / 0 / 0
Регистрация: 09.06.2010
Сообщений: 9
10.02.2011, 13:25     Чем сконвертировать в русский язык такие крякозябры? #20
а там не только эта инструкция предлагается
Yandex
Объявления
10.02.2011, 13:25     Чем сконвертировать в русский язык такие крякозябры?
Ответ Создать тему
Опции темы

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