C ++ и пути к файлам с национальными символами (возможно, с кодировкой utf8) - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть некоторый кроссплатформенный код, и он должен использовать некоторый конфигурационный файл.Все работает нормально, за исключением случая, когда путь к имени файла конфигурации содержит символы, отличные от 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 может содержать нули как часть кодовых точек, такая строка может быть усечена.

Поэтому, пожалуйста, направьте меня, где я не прав, или, пожалуйста, предложите какое-нибудь портативное решение, если я в порядке))

Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2018

UTF-8 не содержит нулей как часть кодовых единиц.Байты в многобайтовых последовательностях должны иметь самый старший установленный бит.Таким образом, текст UTF-8 может заканчиваться нулем, как текст ASCII.

Поэтому вы можете использовать path_name.c_str() в качестве имени файла в кодировке UTF-8.

...