Unicode和多字节字符集 (MBCS) 杂谈

这个估计是很多人曾经头疼过的问题,现在的VC版本基本都支持Unicode和多字节字符集 (MBCS),在进行MFC编程时VC的默认设置是unicode字符集。但是我们通常需要做一些代码移植的工作,如果将多字节字符集下的程序代码移植到unicode字符集环境中,就需要针对此做出很多类型的转换,反之亦然。

首先,了解一下unicode和多字符字符集(MBSS)的区别:

在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。  在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号例如制表符。  后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。

由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。

多字节字符集 (MBCS),字符的宽度可以是一个字节,也可是两个字节。如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。

如果为程序的生成定义了符号 _MBCS,则类型 TCHARCString 基于该类型)将映射到 char。由您来决定CString 中的哪些字节是前导字节,哪些字节是尾字节。C 运行时库提供函数来帮助您进行确定。

在 DBCS 下,给定的字符串可以包含所有的单字节 ANSI 字符、所有的双字节字符或两者的组合。这些可能性需要您在分析字符串(包括 CString 对象)时要备加小心。

注意   MFC 中的 Unicode 字符串序列化能够读取 Unicode 和 MBCS 字符串,而不论运行的是哪个版本的应用程序。正因为如此,数据文件在程序的 Unicode 和 MBCS 版本之间是可移植的。

CString 成员函数使用其调用的 C 运行时库特殊的“一般文本”版本,或使用识别 Unicode 的函数,如lstrlen 或 lstrcpy。因此,如果 CString 函数通常情况下调用 strcmp,那么它会调用相应的一般文本函数_tcscmp。根据符号 _MBCS 和 _UNICODE 定义方式的不同,_tcscmp 映射如下:

            _MBCS 已定义            _mbscmp

            _UNICODE 已定义        wcscmp

            两者都未定义            strcmp

注意   符号 _MBCS 和 _UNICODE 是互相排斥的。

CString 是基于 TCHAR 数据类型的。如果为程序的生成定义了符号 _UNICODE,则会将 TCHAR 定义为 wchar_t 类型(一个 16 位的字符编码类型);否则,会将它定义为 char(普通的 8 位字符编码)。于是,在 Unicode 下,CString 由 16 位字符组成。如果没有 Unicode,它们则由char 类型的字符组成。

要完成应用程序的 Unicode 编程,还必须:

  • 使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。
  • 当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。
  • 使用 C 运行时字符串处理函数的可移植版本。
  • 使用以下用于字符和字符指针的数据类型:
    • TCHAR   这里将使用 char
    • LPTSTR   这里将使用 char*
    • LPCTSTR   这里将使用 const char*CString 提供 operator LPCTSTR 来在 CString和 LPCTSTR 之间进行转换。

CString 还提供识别 Unicode 的构造函数,赋值运算符和比较运算符。

时间: 2024-08-01 22:18:07

Unicode和多字节字符集 (MBCS) 杂谈的相关文章

MFC unicode字符集与多字节字符集 问题之彻底终结!

Unicode 和多字节字符集 (MBCS) 支持 Visual Studio .NET 2003 有些国际市场以大字符集来使用日文和中文等语言.为了支持这些市场的编程,Microsoft 基础类库 (MFC) 支持以两种方式处理大字符集: Unicode 多字节字符集 (MBCS) unicode和多字节字符集是两种不同的编码方式,不同的编码方式下,所对应的一些函数是不兼容的. 读到多字节菜单字符串之后,用MultiByteToWideChar()转为unicode字符串 或者 使用API的A

使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法

随着移动端的发展,跨平台已成为通讯架构设计的重要考虑因素,PC.Android.IOS.WP等跨多平台间的数据通讯,必然要解决字符编码/解码的问题. 多字节字符集MBCS不是跨平台的首选字符集,面向跨平台.国际化的推荐字符集肯定是UNICODE. 写VC的人都知道,在以前VC++6.0中默认的字符集是多字节字符集,而VS2005及以后默认的字符集是Unicode,VS2013中默认不再对多字节字符串进行支持. 但对很多较早的服务端项目,依然使用的是多字节字符集,不过使用多字节字符集依然可以实现跨

多字节字符集与Unicode字符集

在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset). 多字节字符集: 在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个 字符,总共表示128个字符,其中包括了 英文字母.数字.标点符号等常用字符.之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号.后来,由于各国语言的加入,

Unicode字符集和多字节字符集关系(转载)

Unicode字符集和多字节字符集关系 原文链接:http://blog.csdn.net/stephen1315/article/details/ 在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset).      在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母.数字.标点符号等常用字符.之后,又进行扩

使用 “Unicode 字符集 ” 使用错误,应该使用 “使用多字节字符集”

“void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [29]” 出现上面的问题,应该使用多字节字符集 案例地址,百度知道引用 问题: “void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...) CString strDate,strTime; SYSTEMTIME

std::string在多字节字符集环境下substr的实现方法

昨天写到<使用多字节字符集的跨平台(PC.Android.IOS.WP)编码/解码方法>中提到服务端使用std::string处理字符串,std::string对多字节字符集支持并不是很完善,std::string中的函数没有对多字节字符集进行直接的支持. 例如直接调用std::string的substr函数,就会导致某些情况下截取的字符串尾部产生非法字符. GB系列多字节字符集基础知识: VC环境下工程设置为多字节字符集,默认使用的是GBK编码,GB2312.GBK.GB18030,这3个都

MySQL多字节字符集造成主从数据不一致问题

问题产生线上一直有个历史遗留问题,最近DBA提了出来,所以跟了下代码,作了下简单分析,问题描述如下:在master-slave的环境下,对master上的某个表中的数据插入,会导致master-slave数据不一致的情况,通过反复试验,确定出现该情况的条件如下: master上设置了character_set_server=gbk 应用中采用了prepared statement并且设置了useCursorFetch=true 对于master上某个表中的int字段,采用了字符的形式进行插入 比

unicode与MBCS(多字节字符集)

Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况.很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况).      在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数).换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小.外观形

Unicode 与多字节编码

int _tmain(int argc, _TCHAR* argv[]) { //定义LPWSTR 类型的宽字符串 LPWSTR szUnicode = L"This is a Unicode String;"; //定义LPSTR 类型的窄字符串 LPSTR szMutliByte = "This is not a Unicode String;"; //定义 LPTST 类型的自适用字符串 LPTSTR szString = TEXT("This st