Unicode UTF-8 ANSI

简介

Unicode

Unicode 编码共有三种具体实现,分别为utf-8,utf-16,utf-32,其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节。

UTF-8

UTF-8使用1~4字节为每个字符编码即:
对于ANCII只需一个字节(0000~007F),与UTF-8相同;
带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(0080~07FF);
其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码;
其他极少使用的语言字符使用4字节编码。

UTF-8编码规则

如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。

Unicode 与 UTF-8 对照
Unicode 十六进制码点范围UTF-8 二进制
0000 0000 - 0000 007F0xxxxxxx
0000 0080 - 0000 07FF110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

举例:

“汉”的 Unicode 码是 0x6c49(0110 1100 0100 1001)即位于第三行范围,那么对应UTF-8格式为:
1110xxxx 10xxxxxx 10xxxxxx, 16位x对应0x6c49(16位)即把对应的二级制数放到x的位置即可
------->11100110 10110001 10001001 ------>{ 1110(0110) 10(1100)(01) 10(00)(1001) }
------->0xE6 ------0xB1 ------0x89

ANSI

ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00–007F范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。

ANSI与UTF-8只在一个字节时兼容

题外话

关于VS里的多字节字符集是ANSI而unicode字符集是宽字节字符集(UTF-16)
(UTF-16一般对应格式为:0x0000 —0xFFFF,其他一些复杂汉字则是四字节编码)

wchar_t c = L'汉';	
printf("0x%x\n", c);      --> 0x6c49
  1. 用常量字符给wchar_t变量赋值时,前面要加L。如: wchar_t wch2 = L’中’;
  2. 用常量字符串给wchar_t数组赋值时,前面要加L。如: wchar_t wstr2[3] = L”中国”;
  3. 如果不加L,对于英文可以正常,但对于非英文(如中文)会出错。
理解_T()、_Text()宏即L""

查看tchar.h头文件的定义我们知道_T和_TEXT的功能是一样的,是一个预定义的宏。

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

我们再看看__T(x)的定义,发现它有两个:

#ifdef  _UNICODE
// ... 省略其它代码
#define __T(x)      L ## x
// ... 省略其它代码
#else   /* ndef _UNICODE */
// ... 省略其它代码
#define __T(x)      x
// ... 省略其它代码
#endif  /* _UNICODE */

这就表示在VS配置属性中选择的是Unicode时_T和_TEXT相当于L(“字符串”),选择多字节字符时则不带L

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值