UTF-8 的理解

举个简单的例子:

Unicode 只是一个业界标准,具体一个字符占多少字节,取决于编码方式,包括 UTF-8 UTF-16 GB2312 等

“汉” 在 UTF-8 中占到 3 个字节,即 E6 B1 89

在 GB2312 中占到 2 个字节,即 BA BA,一般我们的电脑都是以 GB2312 编码中文的

注意:如果以 VS 编译器以 Unicode 编码,则是 0x6C49,同样占 2 个字节,多字节则是 BA BA

wchar_t aaa[] = L"汉";  // 0x6c49 数组占 4 个字节,包括占两个字节的 ''

char bbb[] = "汉";  // 0xBABA  数组占 3 个字节,包括占一个字节的 ''

 在 UTF-16 中占到 2 个字节,即 0x6C49

UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值),VC都自动采用UTF-16的编码(字符串字面值,literal string,存在很多坑。特别是char *类型的字面值,最终内存使用何种编码方式完全取决于当前文件的编码方式。也就是说当前文件如果是GBK编码的,那么文件里char * str = "中午",str指向的内存字符串二进制是使用GBK编码的。如果文件编码是UTF-8,那么内存是使用UTF-8编码。所以为什么一直要强调字符串应该放在资源文件里,而不是硬编码在.h/.cpp文件里!)。

使用 UTF-8 的优势,没有字节序的概念,特别适合用于字符串的网络数据传输,不用考虑大小端问题。对于非英文网页(对于我们而言,简单说东亚文字网页),能够避免各种乱码问题。

相关链接:

简单几句话总结Unicode,UTF-8和UTF-16

byte以及UTF-8的转码规则

原文地址:https://www.cnblogs.com/strive-sun/p/15211950.html