Я обрабатываю много путей к файлам Unicode в моем проекте C ++. Я выполняю проверку в своем коде, если они достаточно хороши, чтобы поместиться в многобайтовую строку, я сохраняю ее как обычную строковую переменную (std :: string), в противном случае, если строка не помещается в многобайтовую строку, я использую ее как широкая строка
Мой вопрос, могу ли я использовать пути полностью как строки? Повлияет ли это на производительность, я должен сделать некоторые строковые манипуляции, открыть файл, создать, переименовать и удалить с помощью wstring. Поэтому, вместо проверки многобайтовой или широкой строки символов, я бы хотел использовать ее непосредственно как wstring, что сэкономило бы мне много if / else.
bool IsUnicodeWString(const std::wstring &_WStr)
{
WCHAR* posUnicodePath = (WCHAR*)_WStr.c_str();
size_t multiByteLen = wcstombs(NULL, posUnicodePath, 0) + 1;
int tempLength = 0;
if (multiByteLen > 0)
{
TCHAR* _tmpTChar = new TCHAR[multiByteLen + 1];
memset(_tmpTChar, '\0', multiByteLen + 1);
tempLength = wcstombs(_tmpTChar, posUnicodePath, multiByteLen);
if (tempLength == std::string::npos)
{
multiByteLen = 0;
}
delete[] _tmpTChar;
}
if(multiByteLen == 0 || multiByteLen == std::string::npos) { // Is Unicode file
return true;
}
else{
return false;
}
}
if(IsUnicodeWString) {
// Use wstring [ Operations - String Manipulations,FilePath used for Open,Read,Write,Create,Delete,Rename,etc]
} else {
//string [ Operations - String Manipulations,FilePath used for Open,Read,Write,Create,Delete,Rename,etc]
}
Пожалуйста, поделитесь своими мыслями …
В Windows попробуйте использовать wchar_t
столько, сколько возможно. Поскольку это стандартное представление символов в Windows, ядро также использует wchar_t
по умолчанию. Все ANSI API являются оболочкой UNICODE API. Если вы разберете API-интерфейсы ANSI, вы узнаете правду.
Также используйте ATL::CString
вместо std::(w)string
если возможно. Потому что используется подсчет ссылок и размер класса равен размеру указателя (4 байта в 32-битных и 8 байтов в 64-битных). Это означает, что вы можете вернуться ATL::CString
напрямую из функций без потери производительности.
Других решений пока нет …