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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 12:00     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #1
Считать UTF-8 текст на кириллице из файла? Нашел много способов, но все они страшные до безобразия. Также кажутся не оптимальными.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 12:00     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?
Посмотрите здесь:

считать текст из файла C++
C++ Считать посимвольно текст из файла
C++ Считать текст из файла
C++ Как правильно считать текст из файла? Весь текст, со всеми знаками, пробелами
Как считать текст из файла? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
05.09.2013, 00:31  [ТС]     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #21
Цитата Сообщение от alsav22 Посмотреть сообщение
То чего вам хочется, не увидите.
Ну если заставить работать данный код на винде, то он вполне устроит меня...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 00:39     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #22
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Ну если заставить работать данный код на винде, то он вполне устроит меня...
В том-то и дело, что навряд ли... Я так понял, у того, кто предложил - Linux?

Добавлено через 2 минуты
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Нашел много способов,
Если бы был очень простой, то зачем тогда этих много? Все бы очень простым пользовались
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
05.09.2013, 00:46     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #23
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
не могу утверждать на 100%, но по-моему здесь нет никакого ОС-зависимого кода. Хотя... я не уверен. (уже)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 01:02     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #24
Цитата Сообщение от gromo Посмотреть сообщение
но по-моему здесь нет никакого ОС-зависимого кода.
Дело не в коде, а в разных кодировках консоли.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
05.09.2013, 01:06  [ТС]     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Дело не в коде, а в разных кодировках консоли.
вот-вот, в cmd - oem 866 вроде, а в терминале юникс машин как-раз utf, поэтому там нормально и выводит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 01:09     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #26
Этот, конечно, видели?
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 <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[5000];
    wchar_t wbuff[5000];
    
    ifstream f("1.txt");
    if (!f) cout << "Error!" << endl;
    else
    {
        int i = 0;
        while (f.get(buff[i])) ++i;
        
        MultiByteToWideChar(CP_UTF8, 0, buff, 5000, wbuff, 5000); //из буфера char в буфер wchar_t .
        setlocale(0, "rus_rus.866"); //включаем другую кодировку.
        wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
        setlocale(0, ".1251"); // вернули кодировку.
    }
    
    system("pause");
    return 0;
}
Миниатюры
Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?  
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
05.09.2013, 01:47  [ТС]     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #27
Цитата Сообщение от alsav22 Посмотреть сообщение
Этот, конечно, видели?
Это не видел. Такой вариант нравится. Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 03:27     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?
Еще ссылки по теме:

C++ Считать квадратную матрицу. Какой самый быстрый способ это сделать?
C++ Определить, какой сначала был день самый тёплый или самый холодный?
Считать utf-8 из файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 03:27     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла? #28
Нужно только учитывать, что некоторые программы (в частности блокнот) вставляют в начало файла маркер кодировки BOM (для UTF-8 три байта). Поэтому сначала нужно проверить, имеет ли файл этот маркер, и если имеет, то исключить первые три байта из записи в буфер.
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    //setlocale(0, ".1251"); //включили кодировку.
    SetConsoleCP (1251); 
    SetConsoleOutputCP (1251); // или так.
    
    char buff[5000];
    wchar_t wbuff[5000];
    
    ifstream f("111.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;
        f.close();
        
        MultiByteToWideChar(CP_UTF8, 0, buff, 5000, wbuff, 5000); //из буфера char в буфер wchar_t .
        setlocale(0, "rus_rus.866"); //включаем другую кодировку.
        wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
        setlocale(0, ".1251"); // вернули кодировку.
    }
    cout << endl;
    system("pause");
    return 0;
}
Yandex
Объявления
05.09.2013, 03:27     Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?
Ответ Создать тему
Опции темы

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