了解多字节/Unicode



我刚刚回到编程C++、MFC、Unicode。在过去的20年里发生了很多变化。

另一个项目的代码编译得很好,但当我将其粘贴到代码中时出现了错误。我花了1-1/2天的时间来解决下面的函数调用:

enter code here
CString CFileOperation::ChangeFileName(CString sFileName)
{
char drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH];
_splitpath_s(sFileName, drive, dir, name, ext);  //error
------- other code
}

在阅读了帮助之后,我将CStringsFileName更改为使用cast:

enter code here
_splitpath_s((LPTCSTR)sFileName, drive, dir, name, ext);  //error

这也造成了一个错误。所以我使用了GetBuffer(),它和上面的一样。

enter code here
char* s = sFileName.GetBuffer(300);
_splitpath_s(s, drive, dir, name, ext);  //same error for the 3rd time
sFileName.ReleaseBuffer();

在这一点上,我很沮丧,但最终意识到我需要将CString更改为Ascii(我认为是因为我被设置为Unicode)。

因此;

enter code here
CT2A strAscii(sFileName);   //convert CString to ascii, for splitpath()

然后在函数_splitpath_s()中使用strAsci.m_pz

这终于奏效了。因此,在所有这些之后,为了使故事变得简短,我需要帮助专注于:1.Unicode与多字节(库调用)2.使用的变量

我愿意再买一本书,请推荐。此外,有没有一种方法可以过滤我在VS2015上的帮助,这样当我在一个变量上按F1时,它只会为我提供Unicode的帮助,以及将旧代码转换为Unicode或将Mylti-Byte转换为Unicode的方法。

希望这不会让人困惑,但我还有一些事情要做。如果我的措辞不完美,请耐心等待。

提前谢谢。

_splitpath的文档列出了基于Unicode(wchar_t)的_wsplitpath版本。这是你应该使用的。不要转换为ASCII或Windows ANSI,这通常会丢失信息,并且在重新组合片段时不会产生有效的路径。

现代Windows编程是基于Unicode的。

Visual Studio C++项目默认情况下是基于Unicode的,特别是它定义了宏符号UNICODE,这会影响<windows.h>中的声明。

所有支持的Windows版本都在内部使用Unicode,您的应用程序也应该这样做。Windows使用UTF-16编码。

要使您的应用程序启用Unicode,您需要执行以下步骤:

  • 将项目的字符集设置为"使用Unicode字符集">(如果当前设置为"使用多字节字符集">)。这不是严格要求的,但它处理的是那些没有明确使用Unicode版本的情况
  • 对字符串使用wchar_t(代替charTCHAR)
  • 使用宽字符串文字(L"..."代替"...")
  • 在MFC项目中使用CStringW(代替CStringACString)
  • 显式调用CRT的Unicode版本(例如wcslen代替strlen_tcslen)
  • 显式调用存在的任何Windows API调用的Unicode版本(例如CreateWindowExW代替CreateWindowExACreateWindowEx)

尝试使用_tsplitpath_sTCHAR

所以最后的代码看起来像:

CString CFileOperation::ChangeFileName(CString sFileName)
{
TCHAR drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH];
_tsplitpath_s(sFileName, drive, dir, name, ext);  //error
------- other code
}

这将使C++编译器能够在构建时使用正确的字符宽度,具体取决于项目设置

最新更新