2015-03-25 6 views
0

Я использую tinyXml для хранения файла конфигурации под FOLDERID_RoamingAppData, или, другими словами, под C: \ Users \ USERNAME \ AppData \ Roaming. Я использую следующую последовательность (упрощенный):TiXmlDocument :: LoadFile для нелатинских имен путей

  1. SHGetKnownFolderPath (FOLDERID_RoamingAppData, 0, NULL, & путь), чтобы получить путь
  2. Encode путь как UTF8
  3. Вызов m_doc.LoadFile (путь) // m_doc является TiXmlDocument объекта
  4. вызова m_doc.Savefile() // Это один не выполняется, если имя пользователя не является латинским

Интересно, как я могу LoadFile/SaveFile, когда имя файл жулик нелатин (т.е. Иврит).

ответ

1

Нет портативного способа кодирования имен файлов Windows в char переменных на основе (C-строки или std::string с), поскольку Windows API не принимает кодировку UTF8.

К счастью, TinyXml предлагает альтернативную форму LoadFile, принимая аргумент FILE*. Вы можете использовать Windows, _wfopen получить такую ​​ручку: вот фрагмент:

SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &path); 
FILE* xmlFile = _wfopen(path, L"r+"); 
m_doc.LoadFile(xmlFile); 

Соответствующая функция SaveFile работает таким же образом - в этом случае использование L"w" в качестве второго параметра _wfopen вызова перезаписать предыдущую версию файла.