ANSI 和 Unicode

Unicode与ANSI在Windows
为什么使用Unicode?

可以很容易地在不同语言之间进行数据交换。

可以实现同一个二进制.exe文件或DLL文件支持多种语言。

可以提高应用程序的运行效率。Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。

Windows CE 是使用Unicode的一种操作系统,完全不支持ANSI Windows函数。

Windows 98 只支持ANSI,只能为ANSI开发应用程序。
区分ANSI和Unicode函数

首先,函数的参数及其返回值的数据类型不同。如:
char *strcpy( char *strDestination, const char *strSource );
wchar_t *wcscpy(的 wchar_t *strDestination, const wchar_t *strSource );
unsigned char *_mbscpy( unsigned char *strDestination, const unsigned char *strSource );

wcscpy and _mbscpy are wide-character and multibyte-character versions of strcpy. The arguments and return value of wcscpy are wide-character strings; those of _mbscpy are multibyte-character strings. These three functions behave identically otherwise.

Windows定义的Unicode数据类型:
WCHAR Unicode字符,PWSTR 指向Unicode字符串的指针,PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。

其次,函数命名规则不同,如:
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy

所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
### MySQL ODBC 驱动中的 ANSI Unicode 版本区别 在讨论 MySQL ODBC 驱动程序时,ANSI Unicode 是指字符编码的不同处理方式。ODBC (Open Database Connectivity) 接口允许应用程序连接到数据库管理系统。 #### 字符集支持差异 - **ANSI版本**: 使用单字节字符集(SBCS),通常适用于ASCII码范围内的数据传输。对于多语言环境下的应用开发来说,这种模式可能无法满足需求[^1]。 - **Unicode版本**: 支持双字节或多字节字符集(MBCS), 如UTF-8 或 UTF-16 编码标准。这使得能够正确存储并检索全球各种文字系统的信息,包括但不限于中文、日文其他复杂脚本的语言. #### 性能考量 由于每个字符占用的空间不同,在性能方面也会有所体现: - 对于仅限于基本拉丁字母的应用场景下,ANSI 可能会提供更快的数据交换速度因为其更简单的内部表示形式; - 当涉及到国际化软件产品或是需要处理多种自然语言的情况,则应优先考虑采用Unicode版以确保兼容性准确性; ```cpp // 示例代码展示如何设置 DSN 的 CharacterSet 参数来指定使用的字符集类型 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc); // 设置为 ANSI char ansiDSN[] = "Driver={MySQL ODBC Driver}; Server=localhost; Database=testdb; User=root; Password=pass;"; SQLDriverConnect(hDbc, NULL, (SQLCHAR*)ansiDSN, SQL_NTS, retConnStr, sizeof(retConnStr), NULL, SQL_DRIVER_NOPROMPT); // 设置为 Unicode wchar_t unicodeDSN[] = L"Driver={MySQL ODBC Driver}; Server=localhost; Database=testdb; User=root; Password=pass; CharacterSet=utf8mb4;"; SQLDriverConnectW(hDbc, NULL, (SQLWCHAR*)unicodeDSN, SQL_NTS, wretConnStr, sizeof(wretConnStr)/sizeof(wchar_t)-1, NULL, SQL_DRIVER_NOPROMPT); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值