是否可以在 Visual Studio 2010 项目中使用多个“字符集”?

Posted

技术标签:

【中文标题】是否可以在 Visual Studio 2010 项目中使用多个“字符集”?【英文标题】:Is it possible to use multiple "character sets" in a visual studio 2010 project? 【发布时间】:2015-11-14 18:42:14 【问题描述】:

如您所知,在visual studio 2010(c++) 中,我们有noset、unicode 和MBCS 字符集,我们可以通过菜单或预处理器指令(如#define _UNICODE)进行设置。 我正在做一个项目,它有一个使用 MBCS 字符集生成信息的文件(实际上它解析一个 html 文件!),项目中的其他文件通过 unicode 字符集工作以支持亚洲语言。我已经通过为文件添加#define _MBCS 和为主文件添加#define _UNICODE 来测试它,但收到了一些编译器错误。 现在有办法解决这个问题吗?

【问题讨论】:

您遇到什么错误? @ivan 当然还有minimal reproducible example。 例如像这样:atlconv.h(776): error C2440: 'return' : cannot convert from 'LPCTSTR' to 'LPCOLESTR' 您是说数据采用不同的字符编码。或者你是说你的源文件是不同的字符编码? 文件获取html文件作为字节数组。并对其进行分析。如果我使用 unicode,我应该将其转换为 wchar_t,这既费时又可能不安全。 【参考方案1】:

LPCTSTR 是指向 TCHAR(字符串)的指针。它映射到 LPWSTR(宽字符字符串)或 LPCSTR(ansi 字符串),具体取决于是否设置了 _UNICODEUNICODE 定义。所有这些 TCHAR 内容都是 Windows 9x 时代的遗留物,当时 Windows 的早期版本在其 API 中没有 Unicode 支持,但开发人员希望针对 NT 和 9x 进行编译。现在所有这些都应该被弃用了。

我的建议 - 摆脱所有 TCHAR 代码,并在使用 ANSI 与 UNICODE 字符串时明确说明。

    将所有项目设置转换为 Unicode。

    将所有 LPTSTR、LPCTSTR、TCHAR、变量显式转换为 LPWSTR、LPCWSTR 或 WCHAR。或者在显式处理 ANSI 字符串时:LPSTR (char*)、LPCSTR (const char*) 或 CHAR (char)。

    调用 Win32 API 时要明确。如果要处理 ANSI 字符串(例如 CreateWindowA 与 CreateWindowW),请使用“A”版本的 API。

    MultiByteToWideString 和 WideStringToMultiByte 是你的朋友。

【讨论】:

谢谢。例如,在第 3 种情况下,文件使用 BYTE pTag[1024];数组或 _tcsupr((_TCHAR*)pTag) 和 _tcscmp((_TCHAR*)pTag, state) 和 _tcscpy(result, (_TCHAR*)state);函数,而使用 Unicode 会使结果不正确! C 运行时函数也是如此。明确使用strcpy / strcmp_wcscpy / _wcscmp。现有代码显式转换的事实一开始就很可怕。 谢谢。那么“BYTE pTempData[FRAME_BUFFER_SIZE]; InternetReadFile(hURL, pTempData, numberOfBytesToRead, &numberOfBytesRead);”呢?功能? pTempData 包含 html 文件!而且我认为将其转换为 wchar_t 不起作用! InternetReadFile 会将 HTML 文件的 bytes 复制到您的字节缓冲区中。 InternetRealFile 返回后,您的 pTempData 中可能会有一组 ascii 字节。所以此时你应该空终止这个数组并复制到分配的char*char[] 缓冲区。是否要将此字符串转换为 Unicode 取决于您自己 - 这取决于您要执行的操作和/或该 HTML 文件的源编码。 谢谢。我想我必须再试一次!

以上是关于是否可以在 Visual Studio 2010 项目中使用多个“字符集”?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Visual Studio 2010 中调用 s-s-rS 2008 R2 报告?

是否有适用于 Visual Studio 2010 的 Youtrack 插件?

visual studio 2010编译c的设置方法

Visual Studio 2010 中计算机之间的同步设置

是否可以在visual studio 2005上,利用arcgis engine 10进行二次开发?如何设置?

如何在 Visual Studio 2010 中使用互斥锁