TiXmlDocument::LoadFile 用于非拉丁路径名

TiXmlDocument::LoadFile for non-latin path names

我用tinyXml把配置文件存放在FOLDERID_RoamingAppData下,也就是C:\Users\USERNAME\AppData\Roaming下。 我使用以下序列(简化):

  1. SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &path) 获取路径
  2. 将路径编码为 UTF8
  3. Call m_doc.LoadFile(path) // m_doc是TiXmlDocument对象
  4. call m_doc.Savefile() // 如果用户名是非拉丁语,则调用失败

我想知道当文件名包含非拉丁(例如希伯来语)字符时我如何 LoadFile/SaveFile。

在基于 char 的变量(C 字符串或 std::strings)中没有可移植的方法来编码 Windows 文件名,因为 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 调用的第二个参数来覆盖文件的先前版本。