TiXmlDocument::LoadFile 用于非拉丁路径名
TiXmlDocument::LoadFile for non-latin path names
我用tinyXml把配置文件存放在FOLDERID_RoamingAppData下,也就是C:\Users\USERNAME\AppData\Roaming下。
我使用以下序列(简化):
- SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &path) 获取路径
- 将路径编码为 UTF8
- Call m_doc.LoadFile(path) // m_doc是TiXmlDocument对象
- call m_doc.Savefile() // 如果用户名是非拉丁语,则调用失败
我想知道当文件名包含非拉丁(例如希伯来语)字符时我如何 LoadFile/SaveFile。
在基于 char
的变量(C 字符串或 std::string
s)中没有可移植的方法来编码 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
调用的第二个参数来覆盖文件的先前版本。
我用tinyXml把配置文件存放在FOLDERID_RoamingAppData下,也就是C:\Users\USERNAME\AppData\Roaming下。 我使用以下序列(简化):
- SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &path) 获取路径
- 将路径编码为 UTF8
- Call m_doc.LoadFile(path) // m_doc是TiXmlDocument对象
- call m_doc.Savefile() // 如果用户名是非拉丁语,则调用失败
我想知道当文件名包含非拉丁(例如希伯来语)字符时我如何 LoadFile/SaveFile。
在基于 char
的变量(C 字符串或 std::string
s)中没有可移植的方法来编码 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
调用的第二个参数来覆盖文件的先前版本。