了解多字节/ Unicode

时间:2017-01-16 00:12:09

标签: c++ unicode macros mfc

我刚刚回到Programming 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
}

在阅读帮助后,我更改了CString sFileName以使用强制转换:

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()

中使用strAscii.m_pz

这终于奏效了。所以在这之后,为了简短起见,我需要帮助关注: 1. Unicode vs Mulit-Byte(库调用) 2.要使用的变量

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

希望这不是混乱,但我有一些赶上来做。如果我的措辞不完美,请耐心等待。

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

现代Windows编程基于Unicode。

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

答案 1 :(得分:1)

所有受支持的Windows版本都在内部使用Unicode,您的应用程序也应如此。 Windows使用UTF-16编码。

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

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

答案 2 :(得分:0)

尝试使用_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 ++编译器在构建期间使用正确的字符宽度,具体取决于项目设置