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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при запуска любого из проектов примеров directx sdk http://www.cyberforum.ru/cpp-beginners/thread948110.html
Вот собственно и ошибка LINK : fatal error LNK1123: сбой при преобразовании в COFF: файл недопустим или поврежден
C++ матрица яркости с помощью каких функций, методов можно получить значение яркости пикселя или может лучше матрицу яркости пикселей изображения на C++ для черно-белого и цветного изображения? из цветного можно... http://www.cyberforum.ru/cpp-beginners/thread948099.html
C++ Запись в фаил бОльшего числа цифр
Подскажите пожалуйста, что нужно использовать для того, чтобы записать в фаил число с большим количеством значимых цифр. ... fstream fs; if (!fs.is_open()) { ...
C++ Работа с двумерным массивом - разобрать строку кода
Изучаю С++ по книге Шилдт Г.(базовый курс 3-е издание). В теме двумерных массивов столкнулся со строкой, над которой сколько бы не ломал голову, не смог найти для себя её обьяснения.Помогите...
C++ Работа с вектором из класса http://www.cyberforum.ru/cpp-beginners/thread948028.html
Доброго времени суток ! Не до конца понимаю "Как это работает"© Есть вектор указателей, объявленный в main() vector<Employee*> emp; который там же и наполняется. Необходимо создать класс...
C++ Как убрать указатели на пробелы и табы Помогите пожалуйста... У Меня следующая проблема: http://i60.***********/thumb/2013/0903/54/e1ea807dc1af483a58b8a883f6cac154.jpeg Как Мне убрать то, что выделено в скриншоте(т.е. указатели на... подробнее

Показать сообщение отдельно
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.09.2013, 00:12
Когдато експерементировал с файлами в кодировке 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru