我在C ++项目中处理了很多Unicode文件路径。我在我的代码中执行检查,如果它们足够精确以适应多字节字符串,我将其保留为普通字符串(std :: string)变量,否则如果字符串不适合Multibyte我将其用作宽字符串。
我的问题是我是否可以将这些路径完全用作绳索......?它会影响性能,我必须做一些字符串操作,文件打开,创建,重命名和使用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]
}
请分享您的想法...
答案 0 :(得分:1)
在Windows中,尝试尽可能多地使用wchar_t
。因为它是Windows中的默认字符表示,所以内核也使用wchar_t
作为默认值。所有ANSI API都是UNICODE API的包装器。如果你反汇编ANSI API,你就会知道真相。
另外,如果可能,请使用ATL::CString
代替std::(w)string
。因为它使用的引用计数和类的大小等于指针大小(32位中的4个字节和64位中的8个字节)。这意味着您可以直接从函数返回ATL::CString
而不会降低性能。