Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
1

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

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

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

OemToChar не подходит. Я мог бы разные способы перебрать, но кроме OemToChar и CharToOem ничего не знаю. Конкретно в данном случае проблема скорее всего в том, что файл изначально был в виндовой кодировке, но выдал его в utf-8 (или перекодировал), но точно не уверен
0
Миниатюры
Чем сконвертировать в русский язык такие крякозябры?  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2011, 16:54
Ответы с готовыми решениями:

Xcode , С++ и русский язык: как вывести в файл русский текст без сбитой кодировки?
Как сделать так, чтобы после некоторых манипуляций в файл выводился русский текст без сбитой...

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

Новые ЯП: существует ли язык программирования лучше чем C++, а если нет, то появится ли через 2-3 года такой язык?
Привет, зашёл на сайт, увидел C++ и подумал: Существует ли ЯП лучше чем C++, или появится ли через...

Русский язык
Собственно, есть проблема. Русский язык вроде работает, но не до конца. То, что написано в коде...

23
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 17:37 2
Дай-ка сам файлик, поиграюсь
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
06.02.2011, 17:50  [ТС] 3
Вотъ.
0
Вложения
Тип файла: rar ccc.rar (473 байт, 40 просмотров)
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
06.02.2011, 19:40 4
Собсно даже блокнот распознал текст Кинуть назад доку или в личку?
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
06.02.2011, 20:30  [ТС] 5
Да мне надо не конкретно этот текст распознать, мне надо программу написать, которая его в нормальный вид перекодирует. А блокнот как распознал?
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 20:48 6
MultiByteToWideChar конвертирует из кодировок в Unicode виндовский
это видимо utf-8?
1
270 / 176 / 46
Регистрация: 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
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
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
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.02.2011, 23:09 9
Evg, по утверждению Manjak'а там и так хорошо выводилось, но даже если там другая кодировка достаточно перевести в wide символы и использовать функции для работы с широкими символами(utf8_to_unicode), не переводя опять в ascii'шные символы
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
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
бжни
2467 / 1676 / 135
Регистрация: 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
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
07.02.2011, 00:04 12
В файле лежит нормальный UTF-16, в конкретном случае достаточно стандартних С++ классов или сишных функций (на UTF-32 не проверял, любителям линухов придется поднапрячься). Ну, а для нормального разбора файла в формате юникод в нем на начале помещается битовая маска - маркировка содержимого так сказать

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

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

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

Если целевая система - только винда, то это 100% little-endian UTF-16, т.е. читай предыдущий пост про функцию IsTextUnicode, если же целью является нечто утопическое - не забивай себе голову.
0
54 / 54 / 23
Регистрация: 02.02.2011
Сообщений: 436
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
270 / 176 / 46
Регистрация: 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;
}

Не по теме:

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

0
ForEveR
07.02.2011, 19:29
  #17

Не по теме:

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

0
0 / 0 / 1
Регистрация: 09.06.2010
Сообщений: 9
10.02.2011, 12:06 18
вот здесь давно все разобрали
ну и вот здесь
хватит в пустую темы создавать при чем с таким заголовком - просто ищите. все такие мелие темы уже давно разобрали. так и искать нужное проще будет
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
10.02.2011, 12:15  [ТС] 19
Цитата Сообщение от Kronex Посмотреть сообщение
вот здесь давно все разобрали
ну и вот здесь
хватит в пустую темы создавать при чем с таким заголовком - просто ищите. все такие мелие темы уже давно разобрали. так и искать нужное проще будет
Для начала прочти выданные тобой ссылки и вникни в то, что там написано. А потом вникни в первый пост данной темы. Если всё равно не понятно, то для самых умных специально написал "OemToChar не подходит".
1
0 / 0 / 1
Регистрация: 09.06.2010
Сообщений: 9
10.02.2011, 13:25 20
а там не только эта инструкция предлагается
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2011, 13:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Русский язык
Всем добрый день! Как исправить проблему того, что в консоле вместо русского языка отображаются...

Русский язык
Доброго времени суток ! Возникла проблема с воспроизведение русского текста ! А именно: как...

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

Русский язык
Как правильно через реестор настроить русский язык?


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

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

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