硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2409|回复: 8
收起左侧

[其它] 字符编码的对比,简易图。

[复制链接]

334

主题

2033

回帖

3040

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3040
发表于 2020-7-8 11:13:46 | 显示全部楼层 |阅读模式
本帖最后由 caicaptain2 于 2020-7-8 11:31 编辑

字符解码对比.png
字符编码解释.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2020-7-9 09:17:07 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

334

主题

2033

回帖

3040

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3040
 楼主| 发表于 2020-7-9 10:50:25 | 显示全部楼层
我查到的资料中,对于UNICODE有些矛盾。 有的说它是总是2个字节存一个字母或者一个汉字,比如Qt里面介绍的。 但是也有说是4个字节存储一个字母或者汉字,比如百度里面的。 烦烦烦。。。
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2020-7-9 12:54:54 | 显示全部楼层
caicaptain2 发表于 2020-7-9 10:50
我查到的资料中,对于UNICODE有些矛盾。 有的说它是总是2个字节存一个字母或者一个汉字,比如Qt里面介绍的 ...

你要弄清楚UNICODE和UTF-16,这两个是不同的,UNICODE是国际统一编码,不过严格来说叫编号更好一些,也就是让一个字符对应一个唯一的编号,比如'0'的unicode编号是0x30,‘零’的unicode编号是0x96F6,表情符号😁的unicode编号是0x1F601。所以你看,一个字符的unicode编号,长度是不一样的,长度不一样带来的问题,就计算机存储时要怎么识别才不出现错乱。比如读出两个数据:0x30,0x30。是两个字符‘0’呢,还是一个字符'〰'?但是unicode是不管这些的,unicode只负责制定一个符号用一个唯一的编号来表示,其他的他就不管了。为了让计算机识别unicode编号而不出现错乱,就需要对unicode编号进行编码,于是人类制定了不同的编码方案。其中一种就是UTF-16,UTF-16跟utf-8一样,长度是可变的。但跟utf-8不一样的是,UTF-16只有2字节或者4字节,这个在编码上能区分出来。QT就采用的UTF-16,UTF-16的好处是寻址方便,效率高。UTF-8的问题是寻址麻烦,最短1字节,最长6字节,但是它省空间。

外文语境里面unicode叫编码,UTF-16也叫编码,这其实不好理解。你看,中文的好处就是,能很容易的区分编号与编码。找时间我写一篇详细些的文章来讲这些编号与编码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2020-7-10 01:24:50 | 显示全部楼层
caicaptain2 发表于 2020-7-9 10:50
我查到的资料中,对于UNICODE有些矛盾。 有的说它是总是2个字节存一个字母或者一个汉字,比如Qt里面介绍的 ...

Unicode字符集,支持的编码方式有UTF-16,UTF-8,UTF-32是编码方式等。

比如Window的Unicode字符集,编码形式是UTF-16。
回复

使用道具 举报

334

主题

2033

回帖

3040

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3040
 楼主| 发表于 2020-7-10 09:28:22 | 显示全部楼层
eric2013 发表于 2020-7-10 01:24
Unicode字符集,支持的编码方式有UTF-16,UTF-8,UTF-32是编码方式等。

比如Window的Unicode字符集, ...

原来如此,豁然开朗!
回复

使用道具 举报

334

主题

2033

回帖

3040

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3040
 楼主| 发表于 2020-7-10 09:55:21 | 显示全部楼层
ghslfgkkl88 发表于 2020-7-9 12:54
你要弄清楚UNICODE和UTF-16,这两个是不同的,UNICODE是国际统一编码,不过严格来说叫编号更好一些,也就 ...

感谢详细的解答!
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2020-7-10 10:28:09 | 显示全部楼层
本帖最后由 ghslfgkkl88 于 2020-7-10 10:43 编辑
caicaptain2 发表于 2020-7-10 09:55
感谢详细的解答!

才发现上面有两个符号网站没显示出来,一个是:。另一个是:。

用图片更正如下:

1:表情符号 1.png 的unicode编号是0x1F601。

2:是两个字符‘0’呢,还是一个字符' 2.png '?
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2020-7-10 14:02:16 | 显示全部楼层
对于C语言来说,一般是wchar_t类型,这个是编译器定义的,比如在Windows默认是16位,Linux默认是32位。最新C11标准有新类型char16_t,char32_t相对应。有源码的话都好办(随便转来转去),库形式的话有点麻烦,需要注意
比如的STemWin V5.44库,同时有wc16(比如:STemWin_CM3_OS_wc16.a)和wc32(比如:STemWin_CM3_OS_wc32.a)的。IAR V8用wc32(对应32位wchar_t),V7和以前用wc16(对应16位wchar_t),移植时注意就好。
友情提示:有的编译器有wchar_t类型选项(可以选择16位或32位),gcc一般默认是32位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 18:21 , Processed in 0.182737 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表