c语言字符集改为多字节,多字节与Unicode

编码知识

一、Unicode与多字节(ANSI )

(1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性>>常规>>字符集中可选择Unicode字符集或者多字节字符集

(2) Unicode与多字节函数版本、字符、字符串类型的区别

Win32 API中大部分参数有字符串的函数都有两个版本

以A结尾,代表多字节版本

以W结尾,代表Unicode版本

根据版本自动选择的

如:CreateEventA

如:CreateEventW

如:CreateEvent

C运行库也有很多类似的函数

多字节版本

Unicode版本

自适应版本

strcpy

wcscpy

_tcscpy

strcat

wcscat

_tscscat

strlen

wcslen

_tcslen

函数有两种,所以字符也有两种

多字节字符

Unicode字符

自适应字符

char

wchar_t

TCHAR

(3) 常见Win32字符串类型

LPSTR、LPWSTR、LPTSTR、LPCTSTR

LP前缀,代表指针;STR后缀代表字符串

LPSTR:代表多字节

LPWSTR:代表Unicode

LPTSTR:T自适应

LPCTSTR:C代表const+T代表自适应

备注:变量类型使用自适应类型后如LPTSTR,相关字符串需要用TEXT()进行包裹

const char* str = "hello";

const wchar_t* wstr = L"hello";

const TCHAR* tstr = TEXT("hello");

(4)关于_T()

#ifdef _UNICODE

#define _T(X) L ## X //Unicode版本

#else

#define _T(X) X //多字节版本

#endif

(5)Unicode与多字节的选择

1.Unicode程序环境适应能力强,不会出现乱码问题

2.Unicode程序运行速度比多字节程序快。原因:Windows内部都是使用Unicode编码,多字节函数会将参数转码后交给Unicode函数

3.控制后台可使用多字节,GUI程序最好使用Unicode

二、Unicode

(1)Unicode实现方式:UTF-32

以4个byte为编码单元进行定长存储,调度器一次性下发4个byte进行存储任务

主要有两种方式:

大端法UTF-32BE:地址由小向大增加,而数据从高位往低位放 ,在网络上传输数据普遍采用的都是大端

小端法UTF-32LE:地址由小向大增加,而数据从低位往高位放,在英特尔处理器,Windows10操作系统,采用小端法。

e3310eaada7c2b93bb3b62b748178f6e.png

(2)UTF-16

也有大小端模式

UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值)

char chinese[] = "你";

//大小为3个byte,一个char存储结束符,两个char存储汉字字符‘你’ 1char:1byte

wchar_t wchinese[] = L"你";

//大小为4个byte, 一个wchar_t存储结束符,一个wchar_t存储汉字字符‘你’ 1wchar_t:2byte(window下)

auto size = sizeof(chinese); // 3 byte

auto wsize = sizeof(wchinese); // 4 byte

auto len = strlen(chinese); // 2个字符(除去结束符)

auto wlen = wcslen(wchinese); // 1个字符(除去结束符)

优势:就是大多数情况下一个wchar_t表示一个字符(包括中文字符)

坑:char *类型的字面值,最终内存使用何种编码方式完全取决于当前文件的编码方式

备注:在Windows上应该铭记没有char / std::string这种类型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string

(3)UTF-8

优势:无字节序的概念,不用考虑大小端问题,适用与字符串的网络数据传输

劣势:如上代码,一个char并不能表示一个汉字字符,往往需要两个char

三、ANSI

(1)概念

可以认为ANSI / MBCS (多字节字符集) / 本地编码是同一个概念,不同的国家和地区制定了不同的标准,有GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准,ASCII就是美国国家的ANSI标准,一个国家的代码到另一个国家使用,有可能由于编码标准不一致,导致乱码,于是才有了万国码Unicode,各国通用。

总结

22dc7a6bdbee5efd5eeacdbc58d4923c.png

Dll的多字节和Unicode

Dll的多字节和Unicode 分类: MFC2013-10-17 13:00 28人阅读 评论(0) 收藏 举报 dll字符集字符集多字节Unicode 我们定义dll的时候会区分: 字符集:使用多 ...

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

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,u ...

编程中的多字节和Unicode

在编译许多程序的时候,我们常常会出现诸如指针转换错误或者const char[] 不能转换成XX的错误,这时很可能就是项目编码的问题了,如果您使用的是VS编程环境,那么打开工程属性,里面就有个选项是给 ...

_bstr_t可接受多字节、UNICODE字符串,方便用以字符集转换

使用_bstr_t需要包含的头文件: #include #include // test.cpp : 定义控制台应用程序的入口点. ...

转:Unicode字符集和多字节字符集关系

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言原生不支持Unicode,但是可以通过使用Unicode编码的字符集来在C语言中使用UnicodeUnicode编码是一种标准字符编码,它将所有的字符都映射到一个唯一的数字编码上。在C语言中,可以使用宽字符类型(wchar_t)来存储Unicode编码的字符。此外,可以使用编码转换函数(如mbstowcs、wcstombs等)来在Unicode编码和其他编码之间进行转换。需要注意的是,使用Unicode编码时,所占用的内存空间会比ASCII编码等要大,因此需要考虑内存的使用和效率问题。 ### 回答2: C语言中的Unicode是一种字符编码标准,它为世界上几乎所有的字符(包括字母、数字、标点符号、符号和特殊字符)提供了一个唯一的编号。Unicode编码使用16位或32位的数字来表示每一个字符,这样就可以表示大约100万个字符。 在C语言中,我们可以使用宽字符类型(wchar_t)来表示Unicode字符。宽字符类型在C语言中使用宽字符常量(L" ")或宽字符字符串(L" ")来表示。宽字符类型的大小可以根据平台的不同而有所变化,通常是2个或4个字节C语言提供了一些函数来处理Unicode字符,如wcslen()、wcschr()和wcscpy()等。这些函数的名字前面通常会加上"w"字符,表示它们是用于处理宽字符的。 另外,C语言还提供了<locale.h>头文件,它包含了一些与地区相关的函数,如wctomb()和wcstombs()等。这些函数可以用来在宽字符和多字节字符之间进行转换。 除了使用宽字符类型,C语言也支持使用多字节字符类型(如char)来处理Unicode字符。对于多字节字符类型,我们可以使用一些库函数,如strlen()、strchr()和strcpy()等来处理Unicode字符。需要注意的是,在使用多字节字符类型处理Unicode字符时,可能会出现某些字符无法正确表示的情况。 总之,C语言提供了多种方式来处理Unicode字符,开发者可以根据实际需求选择合适的方式进行编程。 ### 回答3: C语言是一种广泛应用的编程语言,其原生字符集是ASCII码集,它仅包含128个字符。然而,随着全球化和国际交流的发展,ASCII码无法满足日益增长的字符需求。 为了解决这个问题,引入了Unicode字符集Unicode是一种大型的字符编码标准,它为世界上几乎所有的字符都分配了唯一的数字编号,包括拉丁字母、汉字、阿拉伯数字、标点符号等。Unicode字符集可以包含超过100万个字符,为全球用户提供了广泛的文本表示能力。 使用C语言处理Unicode字符集需要进行一些适配工作。首先,我们需要确保源代码文件的编码方式与Unicode兼容,可以选择使用UTF-8编码方式。其次,C语言提供了wchar_t数据类型,用于表示宽字符。宽字符是Unicode字符集中的字符,其大小通常为2个字节或4个字节,取决于编译器的实现。 为了正确处理Unicode字符,C语言提供了一套宽字符处理函数,如wcslen计算宽字符串的长度,wcscpy复制宽字符串等。此外,还可以使用宽字符常量来表示Unicode字符,例如L'中'表示中文字符"中"。 在实际编程中,我们可以使用C语言Unicode支持来处理不同语言的文字、生成多语言支持的程序和处理国际化字符串。但是需要注意的是,不同操作系统和编译器对于Unicode的支持程度可能不同,因此在跨平台开发时需要进行适当的处理。 总之,C语言通过引入Unicode字符集和宽字符处理函数,为处理全球范围内的字符提供了支持,使得开发者可以更好地处理多语言环境下的文本数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值