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

时间:2015-03-25 10:24:30

标签: utf-8 non-ascii-characters tinyxml

我使用tinyXml在FOLDERID_RoamingAppData下存储配置文件,换句话说,在C:\ Users \ USERNAME \ AppData \ Roaming下存储。 我使用以下序列(简化):

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

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

1 个答案:

答案 0 :(得分:1)

由于Windows API不接受UTF8编码,因此没有可移植的方法来编码基于char的变量(C-strings或std::string s)中的Windows文件名。

幸运的是,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调用的第二个参数来覆盖文件的先前版本。