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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при запуска любого из проектов примеров directx sdk http://www.cyberforum.ru/cpp-beginners/thread948110.html
Вот собственно и ошибка LINK : fatal error LNK1123: сбой при преобразовании в COFF: файл недопустим или поврежден
C++ матрица яркости с помощью каких функций, методов можно получить значение яркости пикселя или может лучше матрицу яркости пикселей изображения на C++ для черно-белого и цветного изображения? из цветного можно преобразовать RGB Y = 0.299*R+0.587*G+0.114*B но как получить параметры RGB для пикселя не знаю... getpixel вроде долго работает...его не рекомендуют использовать....может с помощью OpenCV или... http://www.cyberforum.ru/cpp-beginners/thread948099.html
C++ Запись в фаил бОльшего числа цифр
Подскажите пожалуйста, что нужно использовать для того, чтобы записать в фаил число с большим количеством значимых цифр. ... fstream fs; if (!fs.is_open()) { fs.open("Efemeride.txt",ios::out); } ... double x = vec.getItem(0,0); ...
C++ Работа с двумерным массивом - разобрать строку кода
Изучаю С++ по книге Шилдт Г.(базовый курс 3-е издание). В теме двумерных массивов столкнулся со строкой, над которой сколько бы не ломал голову, не смог найти для себя её обьяснения.Помогите пожалуйста растолковать строку обведённую красной линией, почему именно такая формула использована в данной ситуации. Тут двумерному массиву присваиваются последовательные числа от 1 до 12.
C++ Работа с вектором из класса http://www.cyberforum.ru/cpp-beginners/thread948028.html
Доброго времени суток ! Не до конца понимаю "Как это работает"© Есть вектор указателей, объявленный в main() vector<Employee*> emp; который там же и наполняется. Необходимо создать класс для работы с ним. Совсем не ясно, как создать конструктор, принимающий указатель на этот вектор. И непонятно, как к нему через методы этого же класса обращаться. Например, необходимо сохранить инфу из...
C++ Как убрать указатели на пробелы и табы Помогите пожалуйста... У Меня следующая проблема: http://i60.***********/thumb/2013/0903/54/e1ea807dc1af483a58b8a883f6cac154.jpeg Как Мне убрать то, что выделено в скриншоте(т.е. указатели на то, что "там стоит пробел", там "таб"...)? Пробовал уже сделать полный сброс настроек - не помогло... подробнее

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