Utf 8 TiXmlDocument::非拉丁路径名的加载文件

Utf 8 TiXmlDocument::非拉丁路径名的加载文件,utf-8,non-ascii-characters,tinyxml,Utf 8,Non Ascii Characters,Tinyxml,我使用tinyXml将配置文件存储在FOLDERID\u RoamingAppData下,或者换句话说,存储在C:\Users\USERNAME\AppData\Roaming下。 我使用以下顺序(简化): SHGetKnownFolderPath(FOLDERID\u RoamingAppData,0,NULL,&path)以获取路径 将路径编码为UTF8 调用m_doc.LoadFile(path)//m_doc是TiXmlDocument对象 调用m_doc.Savefile()//如果用

我使用tinyXml将配置文件存储在FOLDERID\u RoamingAppData下,或者换句话说,存储在C:\Users\USERNAME\AppData\Roaming下。 我使用以下顺序(简化):

  • SHGetKnownFolderPath(FOLDERID\u RoamingAppData,0,NULL,&path)以获取路径
  • 将路径编码为UTF8
  • 调用m_doc.LoadFile(path)//m_doc是TiXmlDocument对象
  • 调用m_doc.Savefile()//如果用户名不是拉丁语,则此调用失败

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

    由于Windows API不接受UTF8编码,因此没有可移植的方法将Windows文件名编码为基于
    char
    的变量(C字符串或
    std::string
    s)

    幸运的是,TinyXml提供了另一种形式的
    加载文件
    ,接受
    文件*
    作为参数。您可以使用Windows
    \u wfopen
    来获得这样的句柄:下面是一个代码片段:

    SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &path);
    FILE* xmlFile = _wfopen(path, L"r+");
    m_doc.LoadFile(xmlFile);
    
    相应的函数
    SaveFile
    的工作方式相同–在这种情况下,使用
    L“w”
    作为
    \wfopen
    调用的第二个参数来覆盖文件的早期版本