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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
#1

Перевести строку из одной кодировки в другую - C++

13.04.2012, 21:25. Просмотров 3065. Ответов 27
Метки нет (Все метки)

Нужно написать программу, перекодирующую строку в кодировке KOI в строку в кодировке Windows-1251 и обратно.

Прорыскал пол-инета, но ничего интересного не нашел. Помогите, хотя бы распишите алгоритм решения :)

Предполагаемые варианты решения:
1) Считывание из файла в опр. кодировке строки, и дальнейшая "подгонка кусками" под другую кодировку, т.е. все различия между кодировками минимизировать.
2) Использовать специализированные функции, только пока непонятно какие :D
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2012, 21:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевести строку из одной кодировки в другую (C++):

Как перевести файл из одной кодировки в другую? - C++
Можете привести реально работающий пример, или ссылку на подробное руководство по переводу файлов из одной кодировки в другую. Мне...

Написать программу конвертер текстовых файлов с одной кодировки в другую из файла (CP1251, UTF8, KOIR8) - C++
Написать программу конвертер текстовых файлов с одной кодировки в другую из файла (текст кириллица. Помогите написать:)

Перевести число из одной системы счисления в другую - C++
Ребят, помогите, уже неделю бьюсь головой об ноут... Нам дали задачу написать прогу, которая будет переводить число из любой системы...

Класс Time. Не могу перевести на другую строку - C++
// Class Time(with operator. Example4).cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include...

Можно ли из букв одной строки составить другую строку? - C++
надо проверить, можно ли из первой строки, что мы вводим с клавиатуры, составить слово (строка2), программа не учитывает пробелы, может кто...

можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это реализовать? - C++
можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это...

27
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.04.2012, 21:40 #2
Неверная кодировка текста в компонентах формы при получении почты через IdPOP3
1
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
13.04.2012, 21:53  [ТС] #3
C++
1
AnsiString KoiToWin(const AnsiString St)
Что же это за тип - "AnsiString"? Какой файл подключать не подскажете?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.04.2012, 22:16 #4
Что же это за тип - "AnsiString"? Какой файл подключать не подскажете?
это тип строка из С++ Builder-a
Думаю если постараться можно заменить на std::string
1
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
13.04.2012, 22:18  [ТС] #5
Нашел какой-то "vlc.h". На моем CodeBlocks его к сожалению нет. Нет ли какой-нибудь замены типу AnsiString?

Добавлено через 56 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
...заменить на std::string
Ок, сейчас попробую.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.04.2012, 22:20 #6
Вместо St.Length() тогда St.size()
Неручаюсь за код так как не проверял...
1
dr.curse
389 / 345 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
13.04.2012, 22:28 #7
Цитата Сообщение от Avazart Посмотреть сообщение
Вместо St.Length() тогда St.size()
можно и St.length()

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::string KoiToWin(const std::string St)
{
 char Koi_WinChars[] = {
      128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
      144,145,146,147,148,149,150,151,152,153,218,155,176,157,183,159,
      160,161,162,184,186,165,166,191,168,169,170,171,172,173,174,175,
      156,177,178,168,170,181,182,175,184,185,186,187,188,189,190,185,
      254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
      239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
      222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
      207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218};
 std::string Result = St;
 for (int i = 1; i <= St.length(); i++)
 {
  if (int(St[i]) > 127)
    Result[i] = Koi_WinChars[St[i]];
 }
 return Result;
}
1
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
13.04.2012, 22:41  [ТС] #8
Пока не понимаю как, но это работает :D
Спасибо Вам :)

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
#include <iostream>
#include <fstream>
 
 
using namespace std;
 
string WinToKoi(const string St)
{
 char Win_KoiChars[] = {
      128,129,130,131,132,133,134,135,136,137,060,139,140,141,142,143,
      144,145,146,147,148,169,150,151,152,153,154,062,176,157,183,159,
      160,246,247,074,164,231,166,167,179,169,180,060,172,173,174,183,
      156,177,073,105,199,181,182,158,163,191,164,062,106,189,190,167,
      225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
      242,243,244,245,230,232,227,254,251,253,154,249,248,252,224,241,
      193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
      210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209};
 string Result=St;
 for (int i = 1; i <= St.length(); i++)
 {
  if (int(St[i]) > 127)
    Result[i] = Win_KoiChars[St[i]];
 }
 return Result;
}
 
//---------------------------------------------------------------------------
string KoiToWin(const string St)
{
 char Koi_WinChars[] = {
      128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
      144,145,146,147,148,149,150,151,152,153,218,155,176,157,183,159,
      160,161,162,184,186,165,166,191,168,169,170,171,172,173,174,175,
      156,177,178,168,170,181,182,175,184,185,186,187,188,189,190,185,
      254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
      239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
      222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
      207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218};
 string Result = St;
 for (int i = 1; i <= St.length(); i++)
 {
  if (int(St[i]) > 127)
    Result[i] = Koi_WinChars[St[i]];
 }
 return Result;
}
 
 
 
 
//--------------------------------------
int main()
{
ifstream inKOI("inputKOI.txt");
string s1;
while (!inKOI.eof())
    {
        if (inKOI.eof()) break;
        inKOI >> s1;
    }
cout << "s1: " << s1 << endl;
inKOI.close();
 
string s2;
s2=KoiToWin(s1);
cout << "s2: " << s2 << endl;
 
//---------------------------------------------
cout << endl;
ifstream inWIN("inputWin1251.txt");
string s3;
while (!inWIN.eof())
    {
        if (inWIN.eof()) break;
        inWIN >> s3;
    }
cout << "s3: " << s3 << endl;
inWIN.close();
 
string s4;
s4=WinToKoi(s3);
cout << "s4: " << s4 << endl;
 
    return 0;
}
0
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
13.04.2012, 23:10  [ТС] #9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
C++
1
...128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143..
Что это за последовательность, не подскажете? Конечно понятно что это коды символов, но почему именно в таком порядке? Идет подгонка под другую кодировку?
0
dr.curse
389 / 345 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
13.04.2012, 23:13 #10
Цитата Сообщение от i_SamSky Посмотреть сообщение
Что это за последовательность, не подскажете? Конечно понятно что это коды символов, но почему именно в таком порядке? Идет подгонка под другую кодировку?
i_SamSky, я сам незнаю просто перевел код чтоб без AnsiString работало
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.04.2012, 23:15 #11
Походу таблица соответствий символов
1
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
14.04.2012, 15:51  [ТС] #12
C++
1
2
3
4
5
6
. . . . . .
if (int(St[i]) > 127)
{
   Result[i] = Win_KoiChars[St[i]];
}
. . . . . .
После детального рассмотрения, понял что функция не работает. Точнее не выполняется условие в функции ни при каких обстоятельствах (весь алфавит забивал в строку и прогонял через функцию).

Позже попытался заменить хотя бы один символ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
string WinToKoi2(const string St)
{
    string Result=St;
    for (int i = 0; i <= St.length(); i++)
    {
    if (int(St[i]) == 130)
    {
        Result[i] = St[i]+55; //55 - неточное значение, не обращайте внимания, это приблизительно
    }
 }
    return Result;
}
С помощью этой функции пытаюсь найти символ с кодом 130, т.е. В (русская), и заменить на аналогичный символ из KOI. Задаю строку с набором букв "АБВГДЕЖ..." и прогоняю ее через функцию, но 130 символ, т.е. В, почему-то не находится, в следствие чего условие не выполняется.

Так в чем же проблема, подскажите :)
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
14.04.2012, 17:27 #13
Я тоже догадываля что эти ф-ции не работают, почитал
http://www.script-coding.com/CodePages.html
Многое прояснило.
Как я понял при декодировании надо изменять символы которые
0x00С0 >= ch && ch <= 0x00FF согласно таблицам ( эти символы соответствуют кириллице)

Добавлено через 5 минут
Вот написал ф-цию из KOI8-R в Unicode
IdPOP3. Проверка почты на mail.ru. Неверная кодировка текста.
1
i_SamSky
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 57
14.04.2012, 23:07  [ТС] #14
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
string WinToKoi2(const string St)
{
    string Result=St;
     for (int i = 0; i <= St.length(); i++)
 {
    if (  (int(St[i]) == -64) || (int(St[i]) == -63) || (int(St[i]) == -56) || (int(St[i]) == -55)
       || (int(St[i]) == -54) || (int(St[i]) == -53) || (int(St[i]) == -52) || (int(St[i]) == -51)
       || (int(St[i]) == -50) || (int(St[i]) == -49)
       )
        Result[i] = St[i]+33;
 
    if ( int(St[i]) == -62) Result[i]=St[i]+53;
    if ( int(St[i]) == -61) Result[i]=St[i]+36;
    if ( int(St[i]) == -60 || int(St[i]) == -59)
        Result[i]=St[i]+32;
    if ( int(St[i]) == -58) Result[i]=St[i]+48;
    if ( int(St[i]) == -57) Result[i]=St[i]+51;
    if ( int(St[i]) == -48 || int(St[i]) == -47 || int(St[i]) == -46 || int(St[i]) == -45)
        Result[i]=St[i]+34;
    if ( int(St[i]) == -44) Result[i]=St[i]+18;
    if ( int(St[i]) == -43) Result[i]=St[i]+19;
    if ( int(St[i]) == -42) Result[i]=St[i]+13;
    if ( int(St[i]) == -41) Result[i]=St[i]+39;
    if ( int(St[i]) == -40) Result[i]=St[i]+35;
    if ( int(St[i]) == -39) Result[i]=St[i]+36;
    if ( int(St[i]) == -38) Result[i]=St[i]+37;
    if ( int(St[i]) == -37 || int(St[i]) == -36)
        Result[i]=St[i]+29;
    if ( int(St[i]) == -35) Result[i]=St[i]+31;
    if ( int(St[i]) == -34) Result[i]=St[i]+2;
    if ( int(St[i]) == -33) Result[i]=St[i]+18;
 }
    return Result;
}
Знаю, что это садомазохизм, но все же я кое-как написал функцию :D
Буду рад тому, кто найдет во всем этом определенную последовательность и сделает ее покороче.

P.S.: При написании программы выяснилось, что коды символов уезжают в минус почему-то.
P.S.S: Функция пока что переводит только заглавные русские буквы из одной кодировки в другую, до маленьких руки еще не дошли.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
14.04.2012, 23:53 #15
Здесь что -то не то не должно быть отрицательных чисел.
1
14.04.2012, 23:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2012, 23:53
Привет! Вот еще темы с ответами:

Функция, которая копирует строку в другую строку заданное количество раз - C++
Помогите!!!! срочно нужна задача. Не знаю как сделать. Разработать функцию, которая копирует строку в другую строку заданное количество...

Перевести длинную бинарную строку в строку с десятичными цифрами - C++
Добрый день. Проблема следующая: есть бинарное число 11010111010111111110.......11100011010110110 - необходимо его представить в виде...

Перекодировать строку из кодировки KOI в кодировку Windows-1251 и обратно - C++
Кодировщик. Написать программу, перекодирующую строку в кодировке KOI в строку в кодировке Windows-1251 и обратно. написать...

Перевести L студентов с 1-й группы в другую (списки) - C++
Даны 2 списка, содержащих фамилии студентов 2-х групп. Перевести L студентов с 1-й группы в другую. Число пересчета-К. Для меня списки -...


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

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

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