都2023年了, 你还傻傻的分不清utf-8,utf-16,utf-32和unicode?

字符集如ASCII、Unicode用于将字符映射到数字。Unicode有UTF-8、UTF-16、UTF-32编码,C++11引入char16_t和char32_t支持UTF-16和UTF-32,C++20添加了char8_t支持UTF-8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符集

字符集(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值