关于c,c++ char,wchar_t,char16_t,char32_t与各种编码集的兼容

@总结:关于c,c++ char,wchar_t,char16_t,char32_t与各种编码集的兼容

在这里插入图片描述
搞了很久,看编码集,总结网上,必须要加个u8才能保证数据不出错
最后,看了下网上讲这个很少,就随手发了个贴

大家好,之前一直遇到多次关于char存数据出现错误的问题,搞了很久,有点头绪,文章可能会有误,如果有错误,欢迎指正。
在这里插入图片描述
看官方文档:
char如果不能存ASCII,utf-8,iso等等字符编码集用一个字节表示的东西,就会出现?,其实语言里面这些内置字符类型,是里面有一种与字符集有相关性的的方法去表示这些字符,语言的内置类型与这些编码集有一种兼容性,比如前128与ASCII的兼容

我们先了解下"“字符串字面值的种类:
在这里插入图片描述
查阅书籍:
我推断出没有前缀的”"默认是一个字节存字符就是官网说的,能存那些编码集里面1个字节的,我在utf-8网页找了个其他国家的字符

在这里插入图片描述
有没有发现,有两个不支持储存的
其他符合官网要求,能保证里面正确,不会截断

前缀u的是char16_t,U的是char32_t,u8的能表示utf-8的。我们使用char a[]=""时候最好要匹配,不能匹配的话只能尽量保证里面数据二进制内容不少

在这里插入图片描述
在这里插入图片描述

看,如果用这样去赋值,char[]数组每个位置存一个东西
这个错误的原因是因为“”里面是按一个字节存的,®存不了变成?
他只截取了®的前一个字节
导致赋值都不用看,已经错了

在这里插入图片描述
在这里插入图片描述

如果这样写前缀u8你看®用两个位置去存了,“”字符串字面值是不会出错了,打印的时候是因为编码问题,printf()按照什么去解析这个char[]。
总之:这样对我们保存数据是不会导致数据错误了

当字符串字面值没错的时候,赋值过去,编译器认识b数组是看每个字节来认识的,所以‘?’
然后为了避免这些问题,我总结了下,避免这些问题办法是,等价赋值,比如
wchar_t a[n]=L"daihi的傲" 这样去写
如果一定要使用char 就不能让""字符串字面值出错,里面字符要能够安装“”的能识别的编码集

对于上网,网页显示的默认编码集是GBK,我复制到记事本,要按照GBK编码集读取才不会错,有些软件很智能,能够识别我们复制的东西是什么编码集的,然后可能会转换为这个软件的默认读取方式(比如我设置VS2019是Unicode),这样就不会出错了。所以大家复制东西需要注意编码集问题

我们比较常用的还有wchar_t,语言规定用两个字节存,原理其实一样的:

下一个,其实我有个问题想不明白
翻阅网上文章
在这里插入图片描述char16_t的能用表示utf-16,如果一个字符是utf-16表示的,他是用4个字节表示的,怎么存进去char16_t ?

这里楼主还是大二的菜鸡啊,语言内部的我们也不懂怎么实现的,但是只用知道char16_t能存utf-16的数据,如果去存4个字节的。
应该数据不会出错的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吃货222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值