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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
#1

Чтение Unicode - C++

15.09.2013, 16:25. Просмотров 2092. Ответов 13
Метки нет (Все метки)

Есть файл в кодировке Unicode. Надо вывести его содержимое в другой файл и в консоль. Использую двухбайтовый тип wchar, но вместо текста выводятся закорючки, причём в выходном файле и консоли они разные.
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
#include <iostream>
#include <windows.h>
#include <fstream>
using namespace std;
 
int main()
{
    setlocale(0,"");
    wchar_t c;
    wifstream Text("formula.txt");
    if(!Text.is_open()){
        cout<<"Error";
        return 0;
    }
    wofstream Output("formula2.txt");
    if(!Output.is_open()){
        cout<<"Error";
        return 0;
    }
    while(Text>>c){
        wcout<<c;
        Output<<c;
    }
    Text.close();
    Output.close();
    system("PAUSE");
    return 0;
}
Добавлено через 22 часа 34 минуты
Никто с этим не сталкивался?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 16:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение Unicode (C++):

Чтение файла в Unicode формате - C++
Как можно за одно обращение к потоку забрать не один байт, а сразу два? Необходимо считать все символы из текстового файла в UNICODE в...

Чтение из файла unicode-символов - C++
Добрый день. помогите пожалуйста с таким вопросом. Имеется файл, сохранённый с кодировкой unicode. в нём записаны символы ζϢ. ...

Чтение UNICODE символов из STDOUT процесса - C++
У меня есть процесс (cmd.exe) создан через WINAPI функцию CreateProcess. К процессу подключено 2 переменных типа HANDLE из которых в свою...

CStdioFile не поддерживает чтение файлов в формате Unicode. Что делать? - C++
К сожалению CStdioFile не поддерживает чтение текстовых файлов в формате Unicode. Может быть кто-нибудь видел класс осуществляющий нечто...

C++ и Unicode - C++
Всем привет. Читая про кодовые точки в Java, мне стало интересно как с этим дела в C++. Т.е. для обычного ASCII мы используем char (1...

Unicode в c++ - C++
Нужно вывести в консоли символ: \ Просто так сделать это нельзя, решил использовать Unicode. Код символа в Unicode : \u005C Как...

13
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 16:35 #2
Цитата Сообщение от Wollen Посмотреть сообщение
Никто с этим не сталкивался?
Ещё как сталкивались... Как вариант (из файла на консоль):
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
 
    ifstream f("upload.txt");
    
    f.getline(buff, 500); // в буффер char из файла UTF-8.
    
    MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
    setlocale(0, "rus_rus.866"); // //включаем другую кодировку.
    wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
    setlocale(0, ".1251"); // вернули кодировку.
    
    system("pause");
    return 0;
}
1
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
15.09.2013, 17:40  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Ещё как сталкивались... Как вариант (из файла на консоль):
Не работает к сожалению.
Ввожу в файл "(((F)˅(G))→(H))". В буфер buff считывается [-17, -69, -65, 40, 40, 40, 70, 41, -53, -123, 40, 71, 41, 41, -30, -122, -110, 40, 72, 41, 41]. В wbuff [65279, 40, 40, 40, 70, 41, 709, 40, 71, 41, 41, 8594, 40, 72, 41, 41].
Но wcout << wbuff; или wcout<<wbuff[i]; не выводят ничего
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 17:57 #4
Цитата Сообщение от Wollen Посмотреть сообщение
Ввожу в файл
Про ввод в файл ничего не знаю. В коде, который я предложил, никакого ввода нет. Как у вас ввод сделан, нужно отдельно разбираться.
Цитата Сообщение от Wollen Посмотреть сообщение
Не работает к сожалению.
У вас не работает... Файл давайте, проверю как у меня будет.
0
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
15.09.2013, 18:27  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Про ввод в файл ничего не знаю. В коде, который я предложил, никакого ввода нет. Как у вас ввод сделан, нужно отдельно разбираться.

У вас не работает... Файл давайте, проверю как у меня будет.
Я неправильно выразился. С клавиатуры в файл ничего не ввожу. Нужно достать данные из файла(включая символы, которых нет в стандартной кодировке) и дальше работать с ним, как с обычным массивом символов для построения синтаксического анализатора.
0
Вложения
Тип файла: txt formula.txt (38 байт, 17 просмотров)
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 19:28 #6
Как этот файл делался?

Добавлено через 25 минут
Там в начале BOM записан, который нужно пропустить.
0
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
15.09.2013, 19:29  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Как этот файл делался?
Копированием символов из ворда )
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 19:31 #8
Цитата Сообщение от Wollen Посмотреть сообщение
Копированием символов из ворда )
Копированием во что? В файл блокнота?
0
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
15.09.2013, 19:32  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Копированием во что? В файл блокнота?
так точно
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 19:33 #10
Кроме блокнота, есть ещё у вас редакторы, которые могут файлы в юникоде создавать?
0
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
15.09.2013, 19:33 #11
В файле есть символы, которых нет в 866-й кодировке, поэтому вывод прерывается, как только встречается такой символ. Вот измененный кусок кода от alsav22, где несуществующие символы заменяются на "@":
C++
1
2
3
4
5
6
7
8
9
    f.getline(buff, 500); // в буфер char из файла UTF-8.
    
    MultiByteToWideChar(CP_UTF8, 0, buff+3, 500, wbuff, 500);       // из буфера char в буфер wchar_t...
 
    WideCharToMultiByte(866,0,wbuff,-1,(LPSTR)buff,500,"@",NULL);   // ... и обратно, заменяем отсутствующие в кодовой странице символы на @    
//    setlocale(0, ".1251"); //включили кодировку 1251
    
    cout << buff << endl; // выводим содержимое буфера   
    system("pause");
2
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 19:56 #12
Вот код, с дополнениями zer0mail, который более или менее работает. Если BOM есть, то пропускает:
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    //setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
    
    ifstream f("formula.txt", ios::binary);
    if (!f) cout << "Error!" << endl;
    else
    {
        f.get(buff, 4); // считали первые три байта
        
        if ((unsigned char)buff[0] == 0xEF && (unsigned char)buff[1] == 0xBB && (unsigned char)buff[2] == 0xBF); // если BOM есть, то читаем в буфер c позции за BOM
        else  f.seekg(0); // если BOM нет, то курсор в начало файла
        
        int i = 0;
        while (f.get(buff[i])) ++i;
        buff[i] = '\0';
        f.close();
        
        MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
        WideCharToMultiByte(866, 0, wbuff, -1, (LPSTR)buff, 500, "@", NULL);
        //setlocale(0, "rus_rus.866"); //включаем другую кодировку.
        //wcout << wbuff << endl; // выводим содержимое буфера wchar_t
        cout << buff << endl;
        //setlocale(0, ".1251"); // вернули кодировку.
    }
    
    cout << endl;
    system("pause");
    return 0;
}
1
Миниатюры
Чтение Unicode  
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
15.09.2013, 20:13  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот код, с дополнениями zer0mail, который более или менее работает. Если BOM есть, то пропускает:
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    //setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
    
    ifstream f("formula.txt", ios::binary);
    if (!f) cout << "Error!" << endl;
    else
    {
        f.get(buff, 4); // считали первые три байта
        
        if ((unsigned char)buff[0] == 0xEF && (unsigned char)buff[1] == 0xBB && (unsigned char)buff[2] == 0xBF); // если BOM есть, то читаем в буфер c позции за BOM
        else  f.seekg(0); // если BOM нет, то курсор в начало файла
        
        int i = 0;
        while (f.get(buff[i])) ++i;
        buff[i] = '\0';
        f.close();
        
        MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
        WideCharToMultiByte(866, 0, wbuff, -1, (LPSTR)buff, 500, "@", NULL);
        //setlocale(0, "rus_rus.866"); //включаем другую кодировку.
        //wcout << wbuff << endl; // выводим содержимое буфера wchar_t
        cout << buff << endl;
        //setlocale(0, ".1251"); // вернули кодировку.
    }
    
    cout << endl;
    system("pause");
    return 0;
}
Годный костыль, хотя и не выводит юникодину.
0
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
15.09.2013, 22:20 #14
Wollen, если найдешь способ, как вывести английские, русские и математические символы в консоль, напиши. Многие искали, но никто не нашел (имхо)
1
15.09.2013, 22:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 22:20
Привет! Вот еще темы с ответами:

Unicode символы - C++
Здравствуйте, подскажите, как перевести коды символов типа \u1040 в сами символы?

ANSI to Unicode - C++
Всем доброго времени суток! Есть задачка преобразовать строку в cp1251 в строку в unicode и сохранить ее в файл в кодировке unicode...

Unicode ОШИБКА - C++
Всем привет у меня такая проблема с UNICODE вод код #define UNICODE #define _UNICODE #include &lt;Windows.h&gt; #pragma...

UNICODE функции - C++
Добрый вечер! 1&gt;c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\listing_2\cwnd.cpp(24): warning C4996:...


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

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

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