1.Unicode字符集 原本标准字符集为8位的ASCII码,但世界上的书写语言不能简单地用256个8位代码即一字节表示,就试更宽的值,例如16位值。这就是Unicode非常简单的原理。...在这里会高兴地告诉你前128个Unicode字符(16位代码从0x0000到0x007F)是ASCII码,而接下来的128个Unicode字符(代码从0X0080到0X00FF)是ISO 8859-1对...Unicode中不同部分的字符都同样基于现有的标准。...如果字符的宽度是两个字节,那么它的第一个字节就是一个特殊的“前导字节”,该字节是根据所使用的代码页从某个特定范围选定的。前导字节和“尾字节”合起来指定一个唯一的字符编码。...3.两种字符集对比 VC6的设置:多字节。 VS的默认设置:Unicode,在属性中可以改成多字节。 多字节编码:char,string,CStringA。
比如(以Windows下小端存储为例) char c=’A’;//内存中对应字节41 wchar_t wc=L’A’;//内存中对应字节41 00 char cs[]=”AB”;//内存中对应字节41...); 比如在Windows API中: FindWindowW和FindWindowA W的意思为wide(宽) A的意思为ASCII 在Windows.h中有一个UNICODE宏 底层调用宽字节版本...Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。...(低位) 问题:不同国家的字符集会产生乱码 基于UNICODE的UTF-8 UNICODE(同一码 / 万国码):unicode是2个字节。...C语言中的宽字符的使用 1. 在C语言中使用wchar_t表示宽字符,使用L告知编译器使用Unicode表。wchar_t x1 = L’中’; 2.
2.宽字符型与单字符型 传统的字符型char是单字节字符型,存储的是该字符的ASCII码,占用一个字节。也可以把char理解成单字节整型,取值范围是-128~127。...VC++将wchar_t实现为2个字节,2个字节很显然不能表示所有的Unicode字符,但是通过当前系统的语言环境进行编码转换,两个字节最大能够表示65536个字符,足以表示某个国家的文字。...和char是不同的数据类型,数据宽度也不一样,sizeof(char)==1,wchar_t的数据宽度与编译器的实现有关,再根据当前系统语言环境进行编码转换,足以保证存储Unicode字符,在Visual...(3)对于西文字符(如’A’、‘B’、'C’等)来说,在wchar_t类型的变量中,高字节存放的是0x00,低字节存放的是西文字符的ASCII码值。...在wchar_t类型的字符串中,每个汉字都用双字节表示,采用的是UTF-16编码方式,因此相同的中文字符,存储的码值是不同的。
---- 2.宽字符型与单字符型 传统的字符型char是单字节字符型,存储的是该字符的ASCII码,占用一个字节。也可以把char理解成单字节整型,取值范围是-128~127。...VC++将wchar_t实现为2个字节,2个字节很显然不能表示所有的Unicode字符,但是通过当前系统的语言环境进行编码转换,两个字节最大能够表示65536个字符,足以表示某个国家的文字。...和char是不同的数据类型,数据宽度也不一样,sizeof(char)==1,wchar_t的数据宽度与编译器的实现有关,再根据当前系统语言环境进行编码转换,足以保证存储Unicode字符,在Visual...(3)对于西文字符(如’A’、’B’、’C’等)来说,在wchar_t类型的变量中,高字节存放的是0x00,低字节存放的是西文字符的ASCII码值。...在wchar_t类型的字符串中,每个汉字都用双字节表示,采用的是UTF-16编码方式,因此相同的中文字符,存储的码值是不同的。
参考链接: C++ wcschr() 本篇文章将讲解C++开发中容易混淆的另一个概念——多字节字符集与Unicode字符集。 ...多字节字符与宽字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char、wchar_t。 ...string是普通的多字节版本,是基于char的,对char数组进行的一种封装。 wstring是Unicode版本,是基于wchar_t的,对wchar_t数组进行的一种封装。 ...从计算机字符编码的发展历史角度来看,大概经历了三个阶段: 第一个阶段:ASCII字符集和ASCII编码。 计算机刚开始只支持英语(即拉丁字符),其它语言不能够在计算机上存储和显示。...我们可以用一个树状图来表示由ASCII发展而来的各个字符集和编码的分支: 图 1: 各种类型的编译 如果要更详细地了解字符集和字符编码请参考: 字符集和字符编码(Charset & Encoding
那么问题来了,既然标C不支持Unicode,我们又如何编程使用Unicode呢?我们如何指定程序中的字符串采用ASCII还是Unicode或者两种同时出现在一个程序里面呢?...我们使用这个来定义宽字符版本的字符和字符串,而普通的ANSI还是标准C语言的char来定义。 宽字符串的使用 下面我们对比一下ASCII和Unicode字符(串)的定义及常量的定义方式。...ASCII版本: Char c = ‘A’; Char str[] = “hello, world”; 宽字符版本: wchar_t wch = L’A’; wchar_t wstr[] = L“hello..., world”; 微软的编译器通过这个大写字母“L”开头来识别后面的字符串将编译为一个Unicode的字符或字符串,注意这里的L后面不能有空格。...TCHAR是作为字符、字符串的变量类型,等价于char和wchar_t,如果定义了UNICDOE,TCHAR实际上是wchar_t,否则就是char,这个在winnt.h中能找到。
在C++ 中如果出现中文,会出现乱码的问题,使用notepad++打开保存的二进制文件,出现乱码。...image.png 正常的情况选择UTF8编码正常显示: image.png 在计算机的内部,所有的数据都是以二进制的形式保存的,在存储文本时,需要将文本文件的信息都转换为二进制进行保存,而现实是将二进制转换为文本显示...,所以编码就是以二进制和显示字符直接转换。...ASCII码:是美国制定的一套字符编码,主要用来显示英文字符。 GBK:ASCII编码只适合显示英文字符,但是对中文有6000多个常用汉字,一个字节的大小完全不够用。所以制定GBK标准。...UTF-8:Unicode可以表示所有的字符,但是英文字符也与其他字符一样,使用两个字节进行编码,使得在保存英文文本的时候会多出一倍的存储空间,而大多数的文本信息都是英文的。
经常在写代码的时候需要处理宽字符,ASCII 字符,在代码中看到 wchar、char 等等。一般都是处理一个方法的时候发现需要的是某字符串,然后这边有什么字符串,之后查一个转换方法。...,其实就是把每个字符作为一个具体数字 。对于 Unicode 标准,存在多种编码,例如:UTF-8 编码,UTF-16 编码等等。...UTF-8 以下引用《核心编程》原文: UTF-8 将一些字符编码为 1 个字节(可以说就是那些 ASCII 字符),一些字符编码为 2 个字节,一些字符编码为 3 个字节,一些字符编码为 4 个字节...数据类型 char 1 个字节(8 bit)。用来表示 ASCII 编码。 wchar_t 2 个字节(16 bit)。用来表示 Unicode 字符(UTF-16)。...而效率问题,在 Windows Vista 上(当然可以理解为之后的版本也都如此) A 版本的函数其实只是一个转换层,将传入的 ASCII 字符转换成 Unicode 字符,然后调用 W 版本。
为此,就要将每个字符映射到某个字节组成的单元序列,这种映射称为字符编码。我们所用的工具都要能够将文本字符编码为字节,还能够从字节中解码。这样才能实现文本内容的呈现和存储。...Unicode字符并不牵扯到字符渲染时的字形,字形是字体设计师的事情,虽然字符和字形之间可能有比较复杂的关系。 Unicode不直接将字符映射到字节,而是分两步映射: 编码字符集将字符映射到代码点。...以一种字符编码形式,例如UTF-8,将代码点映射到代码单元序列,其中每个代码单元是一个或多个字节的序列。 Unicode编码字符集是我们通常所说的Unicode。...用于表示所有其他Unicode字符串,缓冲区在此结构之后以相同的方式分配,只有struct_size 不同,char_size 可以是1, 2 或 4。...为了支持其他编码,C90标准中引入了wchar_t类型。与char不同,wchar_t可以保证足够大,可以表示由任何支持的作用域设置所指定的任何编码中的所有字符。
例如,声明和赋值一个CString可以这样: char* charStr = "Kenko"; CString cstr = charStr; 因为在ASCII编码下,CString会把后边这个指针的内存位置...,作为输入流,逐个字符的读入到CString中。...但例如截取网页之类的,输入的字节流还是ASCII,所以会出现问题。 我在编程过程中,就以ASCII编码字节流赋值,导致在后续查找字符串的时候总是找不到。...后边找到问题根源后,就把从CString得到的wchar_t*强制转化为char*。具体问题根源在代码注释中有写。 代码如下,是关于用CInternetSession,截取网页内容的。...32 string strresult(charresult); //char* 转 string 33 34 //从html文件中得到具体信息 35
1.char16_t与char32_t 在C++98中,为了支持Unicode字符,使用wchar_t类型来表示“宽字符”,但并没有严格规定位宽,而是让wchar_t的宽度由编译器实现,因此不同的编译器有着不同的实现方式...这一状况在C++11中得到了一定的改善,从此Unicode字符的存储有了统一类型: (1)char16_t:用于存储UTF-16编码的Unicode字符。...一个字符串从定义到处理再到输出,涉及到编辑器、编译器和输出环境三个因素,正确的处理和显示需要三个因素的共同保障,每一个环节都不能出错。...原因是ASCII字符使用GBK与UTF-8编码码值是相同的,所以直接书写Unicode码值来表示字符串是一种比较保险的做法,缺点就是难以阅读。...4.Unicode的库支持 C++11在标准库中增加了一些Unicode编码转换的函数,开发人员可以使用库中的一些新增编码转换函数来完成各种Unicode编码间的转换,函数原型如下: //多字节字符转换为
默认采用宽字符UNICODE编码方式,定义了Unicode,因此相关的字符串必须为unicode字符串,而非ascii字符串。...LPCWSTR中的W是宽字符的意思,是UNICODE,就是说不是传统的char这种单字节字符,而是一个字符占两字节....也就是:wchar_t * wfilename; (2)指定的Unicode字串常数,请加L“...”...;例如:wchar_t *wfilename= L“HelloWorld”; 3.ansi字串(就是传统的char*)与wchar_t的*unicode的的字符串互转,请用MultiByteToWideChar...4,如果不太懂unicode的,那么就不要加UNICODE定义,用传统的方式来处理。 四、那么如何将char*或者char数组转换成VS2005中的LPCWSTR呢?
char是无符号数还是有符号数(感兴趣的读者可以自行测试一下char的边界,如果char是有符号数,可以给char赋值127或128来看一下会出现什么结果) 现在来说下宽字符wchar_t,先来看下...,Unicode 是宽字符编码的一种,只不过最常见的宽字符编码方式就是Unicode了,UTF-16和UTF-32都是Unicode编码。...可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系, 计算机显示文字或者存储文字,就是一个查表的过程。 而字符编码规定了如何将字符的编号存储到计算机中。...感兴趣的读者可以看一下:刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?... 从上图就可以很清楚的看出“Hello World”这个宽字符串在内存中的存储情况了,因为是宽字符所以大写字母H用两个字节表示(48 00),48是16进制转成10进制就是72,刚好就是'H'的ASCII
)”: 无法将参数 2 从“wchar_t [12]”转换为“LPCSTR” 原因我想大家清楚了,是由于切换了字符集以后,要传递的参数应该由原来的 wchar_t 更换为 char。...要做到在任何字符集下都可以顺利编译通过,我们的代码就要跟随字符集的变化而变化,在 Unicode 下使用 wchar_t,在多字节下使用 char。...其实 TCHAR 和 _T() 都是宏,他们的定义如下(参考上面发的几篇文章连接): #ifdef UNICODE typedef WCHAR TCHAR; #else typedef char...TCHAR 如果是 UNICODE 字符集,则 TCHAR 就是 WCHAR(wchar_t),如果不是 UNICODE 字符集,则 TCHAR 就是 char。...所谓 TCHAR.H 版本,就是可以适应 Unicode 和多字节字符集的宏,使用他们会根据你设置的项目属性自动调用不同的函数,如果你设置的是 Unicode 字符集,则该函数为 wstrlen(),如果你设置的是多字节字符集
来看看一个字符在不同编码下的大小: char ch1; wchar_t ch2; char16_t ch3; char32_t ch4; cout << sizeof(ch1) << endl...举个例子: a在内存中存的是ASCII码值是97,也就是16*6+1 而要在显示器上面显示a时,又会去查97对应的是哪个字符,找到后显示出来: ASCII码值就是那些符号对应的二进制和十进制的值...像下面给的是整形98,但类型是char,它要查ASCII码,对应的就是b: 3. unicode 但ASCII不能表示中文,想要把中文存在计算机上面,一个字节不够表达中文,那么要怎么表达呢?...统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。...在统一码中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。
首先在C语言下的基本字符串类型是char,这个字符串类型与ANSI规定的是一样的。一个字节的低7位用于存放ASCII码,多个字符以空\0x00结尾即表示一个字符串。...T:代表Win32下的宏_T,这个宏是为了兼容ANSI版本和Unicode版本的程序而存在的。就是说当定义了UNICODE或者_UNICODE是表示wchar_t,否则表示char。...我们来举一些例子: CHAR表示char; PCH、WCHAR表示宽字符wchar_t; PSTR、LPSTR、NPSTR表示字符串指针char *; PCSTR、LPCSTR表示字符串常指针constchar...定义时为wchar_t,否则为char; PTSTR、LPTSTR表示TCHAR的指针,不同定义下宽度不同; LPCTSTR表示TCHAR的字符串常指针,不同定义下宽度不同; 怎么样?...其实在Windows平台下,不只是这些字符类型定义出现W和_T分别表示指定为宽字符和编译时根据UNICODE、_UNICODE定义与否选择宽还是单字节,所有的字符串函数也是有这个区分的。
char一共有8个二进制位,即一个字节,理论上能够存储256个字符。基本上足够涵盖计算机当中所有的字母、标点符号以及数字,即ASCII码。...ASCII的全称是美国信息交换标准代码,它是一套电脑编码系统,包含了所有英文字母以及标点符号和一些特殊字符。全表一共有128个字符,刚好可以用一个char(有符号)来存储。...当我们把一个字符赋值给char型变量的时候,它会去查ASCII表,找到字符对应的编号。同样,当我们使用%c输出一个字符的时候,它也会去寻找char中存储的编码对应的符号进行输出。...可以用来存储unicode编码的字符: const wchar_t* str = L"中文"; 我们在中文两个字之前加上了L修饰符,它告诉编译器,这是一个宽字符,我们需要编译器根据locale来进行翻译...locale是指根据计算机用户使用的语言、所在的国家或地区以及文化传统而定义的软件运行时的语言环境。可以将locale理解为一系列环境变量。
A2W、W2A、A2T、T2A _T() 的含义及使用方法 1、A2W和W2A 在《Window核心编程》,多字节和宽字节之间转换比较麻烦的,MultiByteToWideChar函数和WideCharToMultiByte...那么使用ATL的一个很好的字符串的转换宏:A2W和W2A。...char:8位字节类型,表示ASCII码 WCHAR:16位字符类型,表示Unicode字符 typedef wchar_t WCHAR; typedef unsigned short wchar_t...; (1)A2W的用法:char* ——> WCHAR* USES_CONVERSION; CString cstring; char* achar = "qwer"; const WCHAR...USES_CONVERSION; char* achar = "qwer"; CString cstring = A2T(achar); (4)W2A的用法:CString ——> char*
ad ‘文’ Unicode码值:U+6587 UTF-8 编码 e6 96 87 二、我们需要理解用char[ ]和wchar_t [ ]来存放“中文”时有什么不同 char ...中文"的Unicode码值,这符合C标准对宽字符的定义。...这里需要解释的是C标准中规定宽字符是16 bit的字符,而从GNU glibc 2.2开始,类型wchar_t只用于存放32-bit的ISO 10646码值(你可以粗略的把ISO 10646理解成Unicode...我们都知道C中的字符串以'/0'为结束标志,因此printf只会处理wstr[ ]中的前三个byte,而查一查ASCII表,0x2d对应字符'-',0x4e对应字符'N',所以我们会看到”-N"这个诡异的输出...这就是setlocale()的作用所在了,wcrtomb 会依据程序员设定的locale,将wcha_t中存放的码值,转换为相应的的多字节编码。
好了,小小尝试了一下之后,就让我们开始整一整cocos2d-x中的中文了,巧的是cocos2d-x开发包(有兴趣的朋友可以从这里下载)的示例程序中恰好也有一个HelloWorld,那么事不宜迟,就让我们将这个程序修改为中文界面吧...将wchar_t强制转换为char类型,恐怕没有这么简单,考虑ASCII字符A,其相应的wchar_t内容编码可能是这样的0x00|0x41,将其强制转换为char之后,其相应内容其实并没有改变,传给labelWithString... Format)是一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。...它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII相容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。 ...,之前我们硬编码进程序中的L“你好世界”这几个字符原来是什么编码呢?
领取专属 10元无门槛券
手把手带您无忧上云