Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.96/23: Рейтинг темы: голосов - 23, средняя оценка - 4.96
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
1

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

04.09.2013, 12:00. Показов 4443. Ответов 27
Метки нет (Все метки)

Считать UTF-8 текст на кириллице из файла? Нашел много способов, но все они страшные до безобразия. Также кажутся не оптимальными.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2013, 12:00
Ответы с готовыми решениями:

Считать квадратную матрицу. Какой самый быстрый способ это сделать?
Какие самые быстрые способы считывания в с++? Пример : мне надо считать квадратную матрицу. Какой...

Считать текст из файла с кодировкой utf-16 LE
Возникла кое-какая проблема. У меня имеется xml файл, в кодировке UTF-16 LE с определенным...

Язык по программированию какой самый универсальный
Меня интересует самый универсальный язык программирования на котором можно написать всё что я захочу

Какой способ рисования самый быстрый?
Вот нашел интересный код рисования на WinApi, переводил с языка С++: procedure...

27
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
04.09.2013, 12:11 2
а в чем собственно должна заключаться универсальность?
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 12:15  [ТС] 3
Цитата Сообщение от AntonChik Посмотреть сообщение
а в чем собственно должна заключаться универсальность?
В использовании только средств С++, в ктраткости кода, в расходовании ресурсов, в удобочитаемости, etc.

Хотя да, вы правы, я хотел сказать "оптимальный способ"...
0
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
04.09.2013, 13:10 4
Сначала надо понять, как прочитанные данные будут обрабатываться и храниться в памяти.
А самый универсальный - чтение бинарного файла в байтовый массив
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 13:14  [ТС] 5
Цитата Сообщение от zer0mail Посмотреть сообщение
Сначала надо понять, как прочитанные данные будут обрабатываться и храниться в памяти.
Допустим одна строка с помощью getline помещается в string и сразу выводится.
0
526 / 343 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 14:18 6
C++
1
2
3
4
5
    auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    }("utf-8.txt");
2
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
04.09.2013, 14:41 7
Цитата Сообщение от Герц Посмотреть сообщение
auto contents = [] (const std::string& fileName)->std::string {
* * * * std::ifstream in(fileName, std::ios::binary);
* * * * return std::string(std::istreambuf_iterator<char>(in),
* * * * * * std::istreambuf_iterator<char>());
* * }("utf-8.txt");
C++
1
2
3
4
5
6
7
8
auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
 
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    };
 
    std::cout <<contents(std::string("utf-8.txt")) <<std::endl;
Вот так работает.
Герц, это вы опечатались или это еще какая-то фича с++11 при задании аргумента-файла?
1
В астрале
Эксперт С++
8036 / 4793 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2013, 14:46 8
gromo, Все там правильно.
Просто лямбда определяется и сразу же вызывается.
1
526 / 343 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 15:57 9
Да, сделано исключительное ради ограничения области видимости std::ifstream in.
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2013, 16:32 10
Герц, но зачем лямбду-то использовать? В C++ и так блочная область видимости, это же не Javascript.
0
526 / 343 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2013, 17:26 11
Уединенный блок выглядит коряво.
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2013, 17:29 12
Герц, лямбда там, где она совсем не нужна, выглядит ещё более коряво.
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 20:38  [ТС] 13
Цитата Сообщение от gromo Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
auto contents = [] (const std::string& fileName)->std::string {
        std::ifstream in(fileName, std::ios::binary);
 
        return std::string(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>());
    };
 
    std::cout <<contents(std::string("utf-8.txt")) <<std::endl;
Вот так работает.
Кириллица отображается кракозябрами по-прежнему...
Исходный код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
 
int main(int argc, char *argv[])
{
    system("chcp 1251");
    //setlocale(LC_ALL, ".1251");
    for (int i=1; i<argc; i++)
    {
        auto contents = [] (const std::string& fileName)->std::string
        {
            std::ifstream in(fileName, std::ios::binary);
            return std::string(std::istreambuf_iterator<char>(in),
                std::istreambuf_iterator<char>());
        };
        std::cout <<contents(std::string(argv[i])) <<std::endl;
        /*std::ifstream file(argv[i]);
        if (!file.is_open())
            std::cout<<argv[i]<<": Файла с данным именем не существует\n";
        else
        {
            std::cout<<argv[i]<<std::endl;
            while (! file.eof() )
            {
                
                std::string buf;
                getline (file, buf);
                std::cout<<buf<<std::endl;
            }
        }*/
    }
    std::cout<<std::endl;
    std::system("pause");
    return 0;
}

visual studio 2012
Прикрепил сам текстовый файл
Вложения
Тип файла: txt 1.txt (629 байт, 14 просмотров)
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
04.09.2013, 22:24 14
Попробуйте такой вариант. Вы шрифт на Lucida Console сменили в cmd.exe ?
Я не знаю, как там в VStudio, но пишут, что лямбды должен поддерживать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
#include <string>
int main(int argc, char* argv[])
{
    for(int i = 1; i < argc; ++i)
        std::cout<< [] (const std::string& fileName)->std::string {
            std::ifstream in(fileName, std::ios_base::binary);
 
            return std::string(std::istreambuf_iterator<char>(in),
                std::istreambuf_iterator<char>());
        }(argv[i]);
    return 0;
}
проверил на вашем файле 1.txt -- все работает. Пути к файлам задайте абсолютные (на всякий случай)
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
04.09.2013, 23:03  [ТС] 15
Цитата Сообщение от gromo Посмотреть сообщение
Вы шрифт на Lucida Console сменили в cmd.exe ?
Да, конечно.
Цитата Сообщение от gromo Посмотреть сообщение
Попробуйте такой вариант.
Также кракозябры вместо кириллицы...
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
04.09.2013, 23:44 16
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Попробуйте такой вариант.
Также кракозябры вместо кириллицы...
я забыл просто... вы system("chcp 1251"); к этому новому варианту дописывали? Windows у вас русская или на английском языке? Если на английском, то скачайте русскую локаль через центр обновления и поставьте её.

как видно из скриншота все работает. И на Windows тоже должно
Миниатюры
Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?   Какой самый универсальный способ считать UTF-8 текст на кириллице из файла?  
1
1455 / 792 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.09.2013, 00:12 17
Когдато експерементировал с файлами в кодировке UTF8, - вот старый код нарыл, может поможет:
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
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
 
// Convert a wide Unicode string to an UTF8 string
std::string utf8_encode(const std::wstring &wstr)
{
    int size_needed = WideCharToMultiByte(CP_ACP, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte                  (CP_ACP, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}
 
// Convert an UTF8 string to a wide Unicode String
std::wstring utf8_decode(const std::string &str)
{
    int size_needed;
    if ((unsigned char)str[0] == 0xEF && (unsigned char)str[1] == 0xBB && (unsigned char)str[2] == 0xBF) //detect BOM
    {
        size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[3], (int)str.size()-3, NULL, 0);
        std::wstring wstrTo(size_needed, 0);
        MultiByteToWideChar              (CP_UTF8, 0, &str[3], (int)str.size()-3, &wstrTo[0], size_needed);
        return wstrTo;
    }
    else
    {
        size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
        std::wstring wstrTo(size_needed, 0);
        MultiByteToWideChar              (CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
        return wstrTo;
    }
}
 
int main ()
{
    setlocale(0, "");
 
    std::ifstream ifs_UTF8("D:/file_UTF8.txt");
 
    std::string str_UTF8;
    std::getline(ifs_UTF8, str_UTF8);
    std::wstring wstr_UTF8(utf8_decode(str_UTF8));
 
    std::wcout<<"Вывод wstr_UTF8:\t"<<wstr_UTF8<<std::endl;
 
    //############################################################
 
    SetConsoleCP (1251); SetConsoleOutputCP (1251); //иначе ввод русских символов в string будет не коректен
 
    std::string str;
    std::cout<<"\nВвод в консоле:\n";
    std::cout<<"string:-> "; std::getline(std::cin, str);
    std::cout<<"Вывод string: "<<str<<std::endl;
 
    //############################################################
 
    //выводим в файл
    std::ofstream ofs("D:/results.txt", std::ios::ate); //файл будет в кодировке ANSI
 
    ofs<<"Вывод wstr_UTF8(с перекодировкой):\t\t"<<utf8_encode(wstr_UTF8)<<std::endl;
    ofs<<"Вывод строки введенной с консоли:\t\t"<<str<<std::endl;
 
    std::cout<<"\nГотово"<<std::endl;
    return 0;
}
2
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 00:19 18
Цитата Сообщение от gromo Посмотреть сообщение
И на Windows тоже должно
Уверены?
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
05.09.2013, 00:23  [ТС] 19
Цитата Сообщение от gromo Посмотреть сообщение
я забыл просто... вы system("chcp 1251"); к этому новому варианту дописывали? Windows у вас русская или на английском языке? Если на английском, то скачайте русскую локаль через центр обновления и поставьте её.
нет, скопировал чисто ваш вариант, но пробывал и дописывать, не помогает, винда русская
Цитата Сообщение от gromo Посмотреть сообщение
И на Windows тоже должно
обычно даже на одной ОС в разных IDE может по-разному работать...

Добавлено через 2 минуты
Цитата Сообщение от DiffEreD Посмотреть сообщение
вот старый код нарыл, может поможет:
Поможет, но это "экспериментальный код". Я видел способы чтения UTF из файла через расширенные символы, но мне кажется этот способ слишком костыльным и проблемным, хочется увидеть код, который используется повсеместно, проблема же часто встречающаяся.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2013, 00:26 20
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
хочется увидеть код, который используется повсеместно, проблема же часто встречающаяся.
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Нашел много способов, но все они страшные до безобразия.
То чего вам хочется, не увидите.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2013, 00:26

Какой самый быстрый способ решения СЛАУ?
Доброго дня. Помогите выбрать СЛАУ(системы линейных алгебраических уравнений), которым СЛАУ будет...

универсальный способ чтения/создания файла
Всем привет! Нужно создать/прочитать в файл в папке C:\Users\user\Desktop\output.txt на...

Какой универсальный способ фиксировать в БД каждый раз, когда пользователь закрывает вкладку с сайтом в браузере?
если отправлять аякс-запрос к серверу, то нужно ли дожидаться пока он выполнится? такой мой код не...

Какой способ сортировки одномерного массива самый быстрый?
Нужно написать программу как можно очень быстро сортирующую одномерный массив из 1000 элементов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru