2015-05-13 3 views
1

Я использую TinyXML2 для загрузки XML-документа с диска.Загрузите строку с двумя байтами в TinyXML2

Путь к файлу (configFileName) является wstring и я преобразуя его в строку следующим образом:

tinyxml2::XMLDocument doc; 
    std::string fileName(configFileName.begin(), configFileName.end()); 
    doc.LoadFile(fileName.c_str()); 

Это работает, но бывают случаи, когда моя программа работает на двойной байт OS таких как китайский или корейский, и преобразование из wstring в строку выше потеряет персонажей.

Как я могу загрузить путь, такие как следующие:

wstring wPathChinese = L"C:\\我明天要去上海\\在这里等我\\MyProgram"; 

EDIT

Я попытался следующие, чтобы преобразовать строку, но она по-прежнему портит китайские иероглифы:

std::string ConvertWideStringToString(std::wstring source) 
{ 
    //Represents a locale facet that converts between wide characters encoded as UCS-2 or UCS-4, and a byte stream encoded as UTF-8. 
    typedef std::codecvt_utf8<wchar_t> convert_type; 
    // wide to UTF-8 
    std::wstring_convert<convert_type, wchar_t> converter; 
    std::string converted_str = converter.to_bytes(source); 

    return converted_str; 
} 

string pathCh2 = ConvertWideStringToString(wPathChinese); 
+0

Смотрите мой выбор за то, что я пытался. Благодарю. –

+0

Может ли 'std :: string' удерживать эти символы? – TobiMcNamobi

+0

Теперь, когда вы упоминаете, что нет, я так не думаю. Doc.LoadFile принимает в качестве параметра параметр "const char * filename". Поэтому мне нужно найти способ разрешить загрузке строки с этими символами, если это возможно. –

ответ

3

Предлагаю вам использовать

XMLError tinyxml2::XMLDocument::LoadFile(FILE *) 

Таким образом, вы можете просто сделать что-то вроде этого:

FILE* fp = nullptr; 
errno_t err = _wfopen_s(&fp, configFileName.c_str(), L"rb"); 
if(fp && !err) 
{ 
    tinyxml2::XMLDocument doc; 
    doc.LoadFile(fp); 
    fclose(fp); 
} 

И забудьте сделать преобразование кошмара между wstring и строкой ...

Смежные вопросы