У меня есть некоторый кроссплатформенный код, и он должен использовать некоторый конфигурационный файл.Все работает нормально, за исключением случая, когда путь к имени файла конфигурации содержит символы, отличные от ANSI.
Для открытия / чтения файла я использую std::ifstream
.На платформе Windows (MSVC) решение состоит в том, чтобы использовать перегруженную версию std::ifstream
, которая может принимать имя пути как wchar_t*
, поэтому имя пути кодируется как utf16, и нет проблем с национальными символами в пути.
Но какое решение для систем NIX *?Насколько мне известно, все такие имена файлов кодируются с помощью UTF-8, и можно использовать char*
в качестве указателя на строку.Например:
std::string path_name = ...; //assigning path name
std::ifstream fin(path_name.c_str());
Но как насчет c_str()
, который возвращает константный указатель на строку имени файла, за которым следует null
терминатор?Поскольку последовательность байтов UTF-8 может содержать нули как часть кодовых точек, такая строка может быть усечена.
Поэтому, пожалуйста, направьте меня, где я не прав, или, пожалуйста, предложите какое-нибудь портативное решение, если я в порядке))
Спасибо.