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

Перекодировать текст с UTF-8 в ASCII - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
18.11.2014, 21:46     Перекодировать текст с UTF-8 в ASCII #1
Даже не знаю с чего начать
Задача такова:
Есть файл в формате UTF8. Нужно его перекодировать в ASCII и сохранить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 21:46     Перекодировать текст с UTF-8 в ASCII
Посмотрите здесь:

Преобразовние Utf-16 <=> Utf-8 C++
Как перекодировать для Visual C++? C++
Рисование ASCII кодами и русский текст в консоли C++
Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 C++
C++ масив Char (Windows-1251, ASCII, UTF-8)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 22:04     Перекодировать текст с UTF-8 в ASCII #2
man -a iconv
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
18.11.2014, 22:10     Перекодировать текст с UTF-8 в ASCII #3
http://msdn.microsoft.com/en-us/library/dd374130.aspx
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
18.11.2014, 22:19     Перекодировать текст с UTF-8 в ASCII #4
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
#include <codecvt>
#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <locale>
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    std::locale::global(std::locale(""));
    std::locale loc (std::locale(), new std::codecvt_utf8<wchar_t, 0x10ffffUL, std::codecvt_mode::consume_header>);
    std::wifstream wifs(L"d:\\data.txt");
    wifs.imbue(loc);
 
    std::ofstream ofs("d:\\data1.txt");
    wchar_t s[100];
    char d[100];
 
    while(!wifs.eof())
    {
        wifs.getline(s, 100);
        std::wcstombs(d, s, 100);
        ofs << d << endl;
    }
 
    return 0;
}
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
18.11.2014, 23:14  [ТС]     Перекодировать текст с UTF-8 в ASCII #5
а можно этот код разбить на разные функции?
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
18.11.2014, 23:20     Перекодировать текст с UTF-8 в ASCII #6
Ну разбивай. Это же пример.
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
20.11.2014, 13:48  [ТС]     Перекодировать текст с UTF-8 в ASCII #7
что то не получается его откомпилировать. Много ошибок.
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
20.11.2014, 14:15     Перекодировать текст с UTF-8 в ASCII #8
Vasilijs, у меня пример собирается.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
20.11.2014, 14:24     Перекодировать текст с UTF-8 в ASCII #9
Что за ошибки? В какой среде работаешь?
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
20.11.2014, 17:08     Перекодировать текст с UTF-8 в ASCII #10
У меня тоже не собирается
Код
victor@scorpion:~/devel/tmp$ gcc test.cpp -lstdc++ && ./a.out
test.cpp:1:19: фатальная ошибка: codecvt: Нет такого файла или каталога
компиляция прервана.
victor@scorpion:~/devel/tmp$
В каком он пакете интересно, этот codecvt?
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
20.11.2014, 17:09     Перекодировать текст с UTF-8 в ASCII #11
Это linux? Тогда работать не будет, там какие-то проблемы с codecvt.
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
20.11.2014, 17:11  [ТС]     Перекодировать текст с UTF-8 в ASCII #12
я работаю в C++ Builder'e 6
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
20.11.2014, 17:16     Перекодировать текст с UTF-8 в ASCII #13
В древнем Builder тоже не будет. Нужна поддержка C++11.
Используй тогда функции Windows для перекодирования.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
20.11.2014, 18:29     Перекодировать текст с UTF-8 в ASCII #14
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет там проблем
Поподробнее с этого места. Вчера пробовал в Linux Debian, IDE Anjuta. Не понимает он #include <codecvt>. Что и где нужно настроить?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
20.11.2014, 18:37     Перекодировать текст с UTF-8 в ASCII #15
Цитата Сообщение от nmcf Посмотреть сообщение
Поподробнее с этого места.
Проблемы были, ты прав.
Но у меня стоит gcc 4.10 (сборка из репозитория), и я это не учел при написании ответа. Извиняюсь.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
20.11.2014, 18:56     Перекодировать текст с UTF-8 в ASCII #16
Цитата Сообщение от nmcf Посмотреть сообщение
Что и где нужно настроить?
В убунте можно воспользоваться репой
Bash
1
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
19.12.2014, 15:57  [ТС]     Перекодировать текст с UTF-8 в ASCII #17
на данный момент я остановился на этом:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Letter {int win; int utf;};
Letter w1251_utf[]={{0xC0, 0x0410},{0xC1, 0x0411},{0xC2, 0x0412},{0xC3, 0x0413},{0xC4, 0x0414},{0xC5, 0x0415},{0xC6, 0x0416},{0xC7, 0x0417},{0xC8, 0x0418},{0xC9, 0x0419},{0xCA, 0x041A},{0xCB, 0x041B},{0xCC, 0x041C},{0xCD, 0x041D},{0xCE, 0x041E},{0xCF, 0x041F},
                    {0xD0, 0x0420},{0xD1, 0x0421},{0xD2, 0x0422},{0xD3, 0x0423},{0xD4, 0x0424},{0xD5, 0x0425},{0xD6, 0x0426},{0xD7, 0x0427},{0xD8, 0x0428},{0xD9, 0x0429},{0xDA, 0x042A},{0xDB, 0x042B},{0xDC, 0x042C},{0xDD, 0x042D},{0xDE, 0x042E},{0xDF, 0x042F},
                    {0xE0, 0x0430},{0xE1, 0x0431},{0xE2, 0x0432},{0xE3, 0x0433},{0xE4, 0x0434},{0xE5, 0x0435},{0xE6, 0x0436},{0xE7, 0x0437},{0xE8, 0x0438},{0xE9, 0x0439},{0xEA, 0x043A},{0xEB, 0x043B},{0xEC, 0x043C},{0xED, 0x043D},{0xEE, 0x043E},{0xEF, 0x043F},
                    {0xF0, 0x0440},{0xF1, 0x0441},{0xF2, 0x0442},{0xF3, 0x0443},{0xF4, 0x0444},{0xF5, 0x0445},{0xF6, 0x0446},{0xF7, 0x0447},{0xF8, 0x0448},{0xF9, 0x0449},{0xFA, 0x044A},{0xFB, 0x044B},{0xFC, 0x044C},{0xFD, 0x044D},{0xFE, 0x044E},{0xFF, 0x044F}};
 
Letter w1257_utf[]={{0xC0, 0x0104},{0xC1, 0x012E},{0xC2, 0x0100},{0xC3, 0x0106},{0xC4, 0x00C4},{0xC5, 0x00C5},{0xC6, 0x0118},{0xC7, 0x0112},{0xC8, 0x010C},{0xC9, 0x00C9},{0xCA, 0x0179},{0xCB, 0x0116},{0xCC, 0x0122},{0xCD, 0x0136},{0xCE, 0x012A},{0xCF, 0x013B},
                    {0xD0, 0x0160},{0xD1, 0x0143},{0xD2, 0x0145},{0xD3, 0x00D3},{0xD4, 0x014C},{0xD5, 0x00D5},{0xD6, 0x00D6},{0xD7, 0x00D7},{0xD8, 0x0172},{0xD9, 0x0141},{0xDA, 0x015A},{0xDB, 0x016A},{0xDC, 0x00DC},{0xDD, 0x017B},{0xDE, 0x017D},{0xDF, 0x00DF},
                    {0xE0, 0x0105},{0xE1, 0x012F},{0xE2, 0x0101},{0xE3, 0x0107},{0xE4, 0x00E4},{0xE5, 0x00E5},{0xE6, 0x0119},{0xE7, 0x0113},{0xE8, 0x010D},{0xE9, 0x00E9},{0xEA, 0x017A},{0xEB, 0x0117},{0xEC, 0x0123},{0xED, 0x0137},{0xEE, 0x012B},{0xEF, 0x013C},
                    {0xF0, 0x0161},{0xF1, 0x0144},{0xF2, 0x0146},{0xF3, 0x00F3},{0xF4, 0x014D},{0xF5, 0x00F5},{0xF6, 0x00F6},{0xF7, 0x00F7},{0xF8, 0x0173},{0xF9, 0x0142},{0xFA, 0x015B},{0xFB, 0x016B},{0xFC, 0x0FC},{0xFD, 0x017E},{0xFE, 0x017E},{0xFF, 0x02D9}};
 
int utf8toutf16(unsigned int a, unsigned int b, int &r)  //utf8 -> utf16
{
    unsigned int c1=a;
    unsigned int c2=b;
    r=c2&0x3F | c1 << 6 | c1 & 0xFC << 6;
    return r;
}
 
void utf_win1251(char* FileName, char* FileNameOK)     //RUSSIAN    utf16->ASCII
{
    char str[100];
    int cod;
    int Num[100];   //
    FILE* file=fopen(FileName,"rt");
    if (!file) printf("Reading error");
    while (!feof(file))
    {
        fgets(str,100,file);
    }
    for (int i=0;i<strlen(str);i++) Num[i]=str[i];
    //--------------------
    for (int i=0;i<strlen(str);i++)
    {
        //cod=(int) ("%x",str[i]);
        cod=utf8toutf16();
        for (int j=0; j<64; /*j++*/)
        {
            if (cod==w1251_utf[j].utf) {printf("%s ",w1251_utf[j].win);j++;}
            else {printf("?"); j++;}
        }
    }
}
 
 
void utf_win1257(char* FileName, char* FileNameOK)    //LATVIAN
{
    char str[100];
    int Num[100];   // tablica s unicodam
    FILE* file=fopen(FileName,"rt");
    if (!file) printf("Reading error");
    while (!feof(file))
    {
        fgets(str,100,file);
    }
    for (int i=0;i<strlen(str);i++) Num[i]=str[i];
 
}
 
int main(int argc, char* argv[])
{
    /*char FileName[100];
    int res=0;
    char FileNameOK[100];
    if (argc==2) strcpy(FileName, argv[1]);
    else
    {
        printf("> Text file name:  ");
        scanf("%s", &FileName);
        printf("> Saved file name: ");
        scanf("%s", &FileNameOK);
        printf("> Choose code table:\n 1:Win1251 [RUS]\n 2:Win1257 [LAT]\n ");
        scanf("%i",&res);
    } */
    //utf_win1251(FileName,FileNameOK);
 
    //printf("REZ %x ",utf8toutf16(0x00,0x31,0));
 
    //if (res==1) utf_win1251(FileName, FileNameOK);
    //if (res==2) utf_win1257(FileName, FileNameOK);
    //if (res!=1 || res!=2) printf("Please, choose only 1 or 2!\n");
   // workfile(FileName, FileNameOK);
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2014, 16:23     Перекодировать текст с UTF-8 в ASCII
Еще ссылки по теме:

C++ Перекодировать из Паскаля в с++
C++ Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?
C++ Перекодировать из UCS-2 Little Endian в UTF

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14217 / 6232 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
19.12.2014, 16:23     Перекодировать текст с UTF-8 в ASCII #18
Цитата Сообщение от Vasilijs Посмотреть сообщение
Есть файл в формате UTF8. Нужно его перекодировать в ASCII и сохранить.
Добавлю, что это возможно лишь в том случае, если в целевой кодировке
существуют коды для всех символов, которые есть в исходном тексте на UTF-8.
Иначе будут кракозябры и ничего вы с этим не сделаете.
Yandex
Объявления
19.12.2014, 16:23     Перекодировать текст с UTF-8 в ASCII
Ответ Создать тему
Опции темы

Текущее время: 00:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru