Непонятки с кодировками - ANSI, UTF-8, помогите...
От: Аноним  
Дата: 10.07.13 17:33
Оценка:
Коллеги, помогите, пожалуйста.

Задача — есть файл, в нём хранятся строки, которые могут состоять из букв не только латинского, но и практически любого другого алфавита (например, русского или китайского). Их необходимо прочитать, после чего, предположим, передать через API в некоторую другую систему C-строку, полученную при помощи вызова функции-члена c_str, а также записать в другой файл.

В качестве примера рассмотрим лишь запись в другой файл:

#include <boost/filesystem.hpp>

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>

int main()
{
    try
    {
        boost::filesystem::path input_path("./input.txt");
        std::ifstream f_in(input_path.string());
        if (!f_in)
        {
            std::cerr << "An error occurred while opening file " << input_path.string() << '\n';
            return EXIT_FAILURE;
        }
        std::string str;
        f_in >> str;
        if (!f_in)
        {
            std::cerr << "An error occurred while reading string from file " << input_path.string() << '\n';
            return EXIT_FAILURE;
        }

        boost::filesystem::path output_path("./output.txt");
        std::ofstream f_out(output_path.string());
        if (!f_out)
        {
            std::cerr << "An error occurred while creating / opening file " << output_path.string() << '\n';
            return EXIT_FAILURE;
        }
        f_out << str;
        if (!f_out)
        {
            std::cerr << "An error occurred while writing string to file " << output_path.string() << '\n';
            return EXIT_FAILURE;
        }
    }
    catch (const boost::filesystem::filesystem_error& ex)
    {
        std::cerr << "An error occurred while constructing boost::filesystem::path object - " << ex.what() << '\n';
        return EXIT_FAILURE;
    }
}


Предположим, что файл ./input.txt сохранён в кодировке ANSI.

Если в файле ./input.txt содержится строка "str", то всё, разумеется, нормально — в файле ./output.txt оказывается точно такая же строка. Если там содержится строка "строка", то всё тоже нормально. Это и должно быть так? Или это получилось так лишь в моём случае и полагаться на это не стоит? Если первое, то почему? Если второе, то что делать в подобной ситуации? Сохранять файл в кодировке UTF-8 или UTF-16? Как тогда его наиболее грамотно считывать?

Кстати, скопировать китайские слова из буфера обмена в файл ./input.txt, сохранённый в ANSI, у меня так и не получилось. Я так понимаю, и не получится?

Поясните, пожалуйста, человеческим языком. Туториалы в интернете смотрел, но там слишком много информации, в которой, честно говоря, я уже запутался.

Интересует, разумеется, наиболее кросс-платформенный метод. Если всё же такого не существует, то хотелось бы выслушать решения для наиболее популярных ОС, особенно Windows.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.