宽字符

1.宽字符是为了解决国际化,英文软件写好后,要发行到不同的国家,这时就需要使用宽字符,宽字符能把汉字当成一个字符。

2.字符集

  <1>多字节字符集  (窄字符)

  <2>Unicode字符集(用来解决国际化)(宽字符)

3.MessageBox    MessageBox引用了windows.h文件。

  • 宽字符与窄字符的区别:窄字符1字节,窄字符2字节。
  • MessageBox这个函数与 设置有关,默认是unicode,这个设置应该只影响MessageBox函数吧。
  • 宽字符有一个宏指令  L(常量宽字符的标识符),加上它就代表宽字符。

char ch = ‘A‘;  

wchar_r ch1 = L‘A’;

printf("%d%d",sizeof()sizeof(wchar_t));  结果:1和2

printf("%d%d",sizeof(ch)sizeof(ch1));  结果:1和2

printf("%d",sizeof("1我"));   占4个字节,1,我

printf("%d",sizeof(L"1我"));  占6个字节,1,我 各占一个字符;\0,占2个字节

系统设置unicode,需要宽字符  MessageBox(0, L"你好",L“大家好”,0); 运行成功,无乱码

系统设置为多字节字符集  MessageBox(0,"你好","大家好",0);  运行成功,无乱码

MessageBoxA代表调用窄字符

MessageBoxW就表示调用宽字符,想要打印出上面的东西就需要加L了。

当你在程序里设置为BoxA或BoxW那就不用管系统设置了什么,就是看A或W了

为了移植,windows提供了一种自定义的宏TEXT,可以让Message正常工作,自动调整为与编译器设置相同的。

MessageBox(0,TEXT(“你好”),TEXT("大家好"),0)

4.本地化(没有调windows情况下,写一个纯C应用程序,这是需要对宽字符有一个了解)

窄字符也可以显示汉字,但是他处理汉字时,不能把汉字当做一个一个字符来处理

char str[10] = "我"
printf("%s",str);//窄字符显示汉字
pirntf("\n%c%c",str[0],str[1]);
//这时都会打印出‘我’,pirntf("\n%c %c",str[0],str[1])在%c之间插入空格,就显示不出来了

包含头文件locale.hsetlocale(LC_ALL,"zh-CN");  //没有这个下面的汉字显示的是乱码。LC_ALL表全部生效wchar_t wstr[10] = L"1234我是好人";  //宽字符用wprintf,显示英文wprintf(L"%ls",wstr);  //L,l都表示宽字符处理显示英文不需要本地化,显示中文需要本地化。

宽字符,窄字符对原来的英文没有变化,只是换了一个大盒子来装它。

5.

char ch = ‘A‘;
wchar_t wch = L‘A’;
printf("%d",wch);    //在这里打印的只还是65,宽字符就好像是拿一个大盒子去装它,//并没有对原来字符产生任何改变。
时间: 2024-10-12 03:17:47

宽字符的相关文章

宽字符、多字节、unicode、utf-8、gbk编码转化

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号. 而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性.Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通

宽字符,Ansic和Unicode

电脑发展的初期,只是在美国等英文国家使用,英文只有26个字母和其它字符,一个字节最多可以表示256个字符,如字母“A”用0x41(二进制01000001)表示,字母“a”用0x61(二进制01100001)表示.为了使各家电脑公司生产的电脑统一,美国搞了个国家标准ANSI,一直沿用至今,我们今天用的电脑普通情况下使用的都ANSI编码. ANSI编码,每个字符占一个字节,但最多只能表示256个字符.汉字等东亚语言字符怎么办呢?于是采用两个字节共同表示一个汉字的方法.二个字节理论上可以表示65535

宽字符的坑

今天老大让我自己写一个String类 而且还是用宽字符wchar_t进行初始化,大坑,深坑,非常坑啊. 首先,宽字符组成的字符串,len和size并不相等 String类要仿照其他语言,做成一个固定大小的“死字符串” memcpy函数调用过程中,是传的void*,所以这时候就要小心,见如下代码: void String::append(const cqWCHAR* str){    size_t len = cq_wcslen(str);    size_t totalLength = this

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

 1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t start, end; double res = 0; time(&start);  //获取时间,传递给start //volatile强制每次从内存读取 volatile int i; for (i =

gcc编译器对宽字符的识别

最早是使用VC++工具来学习C++,学的越多就越对VC挡住的我看不见的东西好奇,总想多接触一些开发环境,今日抽空摸索了一下CodeBlocks这个开源的IDE使用方法,配置的编译器是MinGW的gcc编译器,gcc编译多字节集的字符还没什么问题,但遇到宽字符,发现编译不通过,经过多方查找,发现gcc对宽字符的支持分规则同我用熟了的cl编译器有一些区别,具体用法如下: GNU   C/C++编译器gcc也可以正确支持wchar_t字符和字符串,但是源代码的保存格式必须符合下面条件:        

Android NDK 下的宽字符编码转换及icu库的使用(转)

原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现,记录下来以备再用. 如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c. ICU4C 是IBM的国际化开发组件ICU的C语言实现版本.在android系统里也有实现.ndk里面并没有公开可用的api,需要自己加载动态库来调用转换函数.

宽字符和窄字符之间的转换,以及对中文的处理问题总汇

直接代码: 注:编译环境VS2010 SP1 1 /*实现宽字节和窄字符转换以及中文文件的输入输出*/ 2 3 #include <iostream> 4 #include <string> 5 #include <fstream> 6 #include <locale> 7 #include <codecvt> 8 #include <windows.h> 9 #include <tchar.h> 10 using na

多字节字符与宽字符重新认识

一直都说,多字节字符,何为多字节,并不只是一个char就是了.英文的字符都是char能表示,但是中文字符,是2个字节表示的. 所以, char s[] = "ha哈哈";     int l = strlen(s);// 6     char c = s[2];// -71 '?' cannot represent s 是占7个字节. s[2]只是'哈'的前半部分,所以决不能写这样的比较代码!!!: if (s[2]=='哈') 所以,字符串中有中文时,一定要格外小心. 甚至,所有的C

(转)C++ UTF8 UrlEncode(宽字符)

#include <stdio.h> #include <wchar.h> #include <Windows.h> #include <string> using namespace std; const wchar_t * hexenc[] = { L"%00", L"%01", L"%02", L"%03", L"%04", L"%05&quo