字符集
字符集(Character Set)是一种用于表示字符的编码方案,也称为字符编码集。它是将字符映射到数字的一种方式。常见的字符集包括 ASCII、ISO-8859、Unicode 等。
在计算机中,所有的信息都是以二进制的形式存储的,而字符集就是将二进制数值映射到具体的字符上的一种方式。例如,ASCII 字符集将 7 位的二进制数值映射到 128 个字符上,包括数字、字母、标点符号等。Unicode 则是一种更加通用的字符集,它将每个字符都映射到一个唯一的码位上,可以表示几乎所有的语言和符号。
Unicode字符集就有UTF-8、UTF-16和UTF-32这3种编码方法。
UTF-8、UTF-16和UTF-32的区别?
UTF-8、UTF-16和UTF-32都是Unicode字符集的编码方式
UTF-8是一种变长编码方式,使用1到4个字节表示一个Unicode字符,其中ASCII字符使用1个字节表示,其他字符使用2到4个字节表示。UTF-8编码方式在存储空间上比较节省,适合在网络传输和存储中使用。
UTF-16是一种定长编码方式,使用2个字节表示一个Unicode字符,如果字符编码超过2个字节,则使用2个16位编码表示。UTF-16编码方式在处理Unicode字符时比较方便,但是在存储空间上比UTF-8浪费。
UTF-32是一种定长编码方式,使用4个字节表示一个Unicode字符,每个字符使用相同的存储空间,因此UTF-32编码方式在处理Unicode字符时比较方便,但是在存储空间上比UTF-8和UTF-16都浪费。
总体来说,UTF-8适合在存储空间有限的情况下使用,UTF-16适合在处理Unicode字符时比较方便的情况下使用,UTF-32适合在需要高效处理Unicode字符的情况下使用。
C++11标准对Unicode字符集的支持
char16_t
是C++11引入的一种字符类型,用于表示16位Unicode字符,针对UTF-16编码方式.使用小写的'u'表示char32_t
是C++11引入的一种字符类型,用于表示32位Unicode字符。使用大写的'U'表示。- 使用u8表示utf-8编码方式
char utf8c = u8'a'; // C++17标准 utf-8
//char utf8c = u8'好';
char16_t utf16c = u'好'; //UTF-16
char32_t utf32c = U'好'; //UTF-32
char utf8[] = u8"你好世界";
char16_t utf16[] = u"你好世界";
char32_t utf32[] = U"你好世界";
char8_t字符类型
使用char类型来处理UTF-8字符虽然可行,但是也会带来一些困扰,比如当库函数需要同时处理多种字符时必须采用不同的函数名称以区分普通字符和UTF-8字符。C++20出现了char8_t类型。
char str[] = u8"text"; // C++17编译成功;C++20编译失败,需要char8_t
char c = u8'c';
//C++11引入
using u16string = basic_string;
using u32string = basic_string;
using wstring = basic_string;
//C++20引入
using u8string = basic_string;
#include <iostream>
#include <string>
int main() {
std::locale::global(std::locale("en_US.utf8"));
std::u8string str = u8"Hello, 世界!";
std::cout << "str: " << std::string_view(reinterpret_cast<const char*>(str.data()), str.size()) << std::endl;
return 0;
}