多字节字符和宽字符

多字节字符和宽字符

开发多语言版软件,经常会碰到字符编码的问题,看了很多资料都说得不是很清楚,终于碰到一篇讲的不错的文章跟大家分享一下!(时间关系,翻译了重点部分)

char型和wchar型

在日文版Windows上我们用到字符编码是Shift-JIS,主要的用1byte表示英数字,2byte表示日文字符,这种编码表示的字符称作多字节字符。(中文版Windows字符编码:GB2312)

char数组的字符

世界上主流的标准字符编码是Unicode,在Windows上,英数字,日文字符,中文字符,其他语言字符,原则上都是用2byte表示一个字符。这种编码表示的字符称作宽节字。

wchar_t数组的字符

字符的声明,定义和大小

为了表示不同的字符串,下面定义了char型和wchar_t型的字符串,其内存大小参考注释部分。

// char(マルチバイト文字列)の宣言と表示
char    strm[]  = "Testストリング";
printf( "%3d: %s\n", sizeof( strm ), strm );    // 15: Testストリング

// wchar_t(ワイド文字列)の宣言と表示
setlocale( LC_ALL, "Japanese" );
wchar_t strw[]  = L"Testすとりんぐ";
wprintf( L"%3d: %s\n", sizeof( strw ), strw );  // 20: Testすとりんぐ

TCHAR型-自动识别编码

在VisualStudio中可以通过TCHAR定义字符,TCHAR型就是typedef定義,程序在编译时候设定为多字节字符时,变成了char型,设定为宽字节字符时,变成了wchar_t型,是个方便的类型。

// TCHAR(自動対応型文字)の宣言と表示
TCHAR   strt[]  = _T("Testすとリング");
_tprintf( _T("%3d: %s\n"), sizeof( strt ), strt );

VisualStudio的字符集的指定

不管你是要用Unicode还是Shift-JIS在VisualStudio中都是可以自由的选择。

在VisualStudio工程解决方案上右击,从弹出的菜单中选择属性,出现如下的图。

文字セット(字符集)-红色框中

設定なし(没有设定):没有设定_UNICODE _MBCS宏,仅适用于英文ANSII。

Unicode 文字セットを使用する(使用Unicode字符集):设定了_UNICODE宏,TCHAR型自动转换为wchar_t型,字符操作函数也自动转换为了对应的宽字符函数。

マルチ バイト文字セットを使用する(使用多字节字符集):设定了_MBCS宏,TCHAR型自动转换为char型,字串操作函数也自动转换为了对应的多字节函数。

多字节字符与宽字符的转换

函数mbstowcs:多字节字符到宽字符的转换函数

// mbstowcs関数でワイド文字列へ変換
char    strm[]  = "Testストリング";
wchar_t strwfm[32];
setlocale( LC_ALL, "Japanese" );
mbstowcs( strwfm, strm, strlen( strm )+1 );
wprintf( L"%s(文字数=%d)\n", strwfm, wcslen( strwfm ) );

函数wcstombs:宽字符到多字节字符的转换函数

// wcstombs関数でマルチバイト文字列へ変換
wchar_t strw[]  = L"Testすとりんぐ";
char    strmfw[32];
setlocale( LC_ALL, "Japanese" );
wcstombs( strmfw, strw, sizeof( strmfw ) );
printf( "%s(文字数=%d)\n", strmfw, strlen( strmfw ) );

P.S参考地址:http://mkubara.com/index.php/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%83%AF%E3%82%A4%E3%83%89%E6%96%87%E5%AD%97%E5%88%97

时间: 2024-08-27 06:03:40

多字节字符和宽字符的相关文章

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

一直都说,多字节字符,何为多字节,并不只是一个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

通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换

通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅.做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然.另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008) (三)Unicode字符集的宽字符和多字节字符转换 在上一节<(二)通过&qu

宽字符,Ansic和Unicode

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

宽字符

1.宽字符是为了解决国际化,英文软件写好后,要发行到不同的国家,这时就需要使用宽字符,宽字符能把汉字当成一个字符. 2.字符集 <1>多字节字符集  (窄字符) <2>Unicode字符集(用来解决国际化)(宽字符) 3.MessageBox    MessageBox引用了windows.h文件. 宽字符与窄字符的区别:窄字符1字节,窄字符2字节. MessageBox这个函数与 设置有关,默认是unicode,这个设置应该只影响MessageBox函数吧. 宽字符有一个宏指令 

boost.log(八)宽字符记录

宽字符记录 Boost.Log支持包含本地字符集字符串的日志记录.基本上有两种方式做这件事.在 UNIX 系统上通常使用一些多字节字符编码 (例如 UTF-8) 用来表示本地字符.在这种情况下,Boost.Log库可以直接以纯 ASCII 的方式记录而不需要其它额外的设置. 在Windows 上常见的做法是使用宽字符串来表示本地字符串.此外大多数系统 API 也是使用的宽字符,这需要特定于 Windows 的接收器也支持宽字符.另一方面,通用的接收器,例如 TextFile,是面向字节的,你写入

[转] C++宽字符操作函数

字符分类: 宽字符函数         普通C            函数描述 iswalnum()      isalnum()       测试字符是否为数字或字母 iswalpha()       isalpha()        测试字符是否是字母 iswcntrl()         iscntrl()         测试字符是否是控制符 iswdigit()         isdigit()         测试字符是否为数字 iswgraph()      isgraph() 

ACE服务端编程2:ACE跨平台之数据类型和宽字符

ACE网络库的主要优势之一就是跨平台,ACE提供了操作系统API和编译器级别的跨平台解决方法,使开发人员不用再去关心操作系统和编译器的差异,但因此也带来了ACE的复杂性. ACE网络库的组织结构主要分为四层:OS适配层.wrapper facade层.框架层.服务层,其中OS适配层为操作系统API提供了包装函数,保证了系统级的跨平台特性. 而不同的C++编译器在以下方面也有明显的差异: 1.模版: 2.数据类型和宽字符: 3.运行时初始化和关闭: 4.分配堆内存: 以上主要参考自APG里内容,但

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

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

宽字节(宽字符)注入

字节注入也是在最近的项目中发现的问题,大家都知道%df' 被PHP转义(开启GPC.用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\',其中\的十六进制是 %5C ,那么现在 %df\' =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗',也就是说:%df\' = %df%5c%27=縗',有了单引号就好注入了.比如: $conn = mysql_connect("lo