宽字符串vs字符串,它是否会影响Windows C++; 我在C++项目中处理了很多Unicode文件路径。我在我的代码中形成一个检查,如果它们足够适合多字节字符串,我将其作为一个普通字符串(std::String)变量保存,否则如果字符串不适合多字节,我将其作为宽字符字符串使用

宽字符串vs字符串,它是否会影响Windows C++; 我在C++项目中处理了很多Unicode文件路径。我在我的代码中形成一个检查,如果它们足够适合多字节字符串,我将其作为一个普通字符串(std::String)变量保存,否则如果字符串不适合多字节,我将其作为宽字符字符串使用,c++,performance,widestring,C++,Performance,Widestring,我的问题是,我是否可以将路径完全用作wstring。。?若它会影响性能,我必须使用wstring进行一些字符串操作、文件打开、创建、重命名和删除。因此,与其检查多字节或宽字符字符串,不如直接将其用作wstring,这样可以节省很多if/else bool IsUnicodeWString(const std::wstring &_WStr) { WCHAR* posUnicodePath = (WCHAR*)_WStr.c_str(); size_t multiByteLen =

我的问题是,我是否可以将路径完全用作wstring。。?若它会影响性能,我必须使用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\u t
作为默认字符。所有ANSI API都是UNICODE API的包装器。如果你反汇编ANSI API,你就会知道真相


此外,如果可能,请使用
ATL::CString
代替
std::(w)字符串。因为它使用了引用计数,类的大小等于指针大小(32位4字节,64位8字节)。这意味着您可以直接从函数返回
ATL::CString
,而无需性能损失。

您应该无条件地使用
std::wstring
,完全忘记将MBC存储在
std::string
中,或者切换到UTF-8而不是MBC,这样就不可能发生数据丢失(MBCS并非损失较小)然后在调用需要UTF-16的API函数时在UTF-8和UTF-16之间进行转换。在担心速度之前,先担心是否正确。坚持一种格式将简化代码,这将使其更容易正确。我的意见是,您的检查和转换函数将比一个到处都使用宽字符串的窗口。几乎所有的窗口(都使用字符串)在内部使用宽字符串,因此在大多数情况下,使用宽字符串版本比使用窄字符串版本便宜。大多数窄字符串函数只需创建一个等效的宽字符串,然后调用宽字符串函数。以下划线开头并后跟大写字母的标识符保留用于推进。不要使用m、 请改用
\u wstr
或去掉下划线。也不需要强制转换。请使用
&\u wstr[0]