Unicode、ASCII、UTF-8编码关系和底层原理

背景

之前遇到过一个bug,我大概描述一下,就是一个搜索列表,比如你想查询性“张”的人,输入一个“张”,对于搜索出来的结果,每个结果的名称标签渲染成蓝色,也就是把每个结果里的“张”字加蓝,但是这个bug,现在变蓝了三个字。

解决思路

1.我后面尝试了搜索纯字母和数字,结果都没问题, 正常渲染加蓝。

2.查看渲染的代码,也没任何问题。

3.经过1和2的尝试,问题锁定到了汉字的问题上,那汉字可能就是编码的问题

4.然后我发现name的类型是QString,而后面搜索渲染search_name类型是string。(有人问为什么从name到search_name要换类型,不换不就没事了,因为这两个都是类里面的变量,很多地方都在用)

5.后面查了一下资料发现,QString的length()方法返回的是字符串中的字符数量,而不是字节数量。而string的length() 方法返回的是字符串所占的字节数,最后将string转换为QString就解决了。

扩展提升

1.这个bug,我解决后问过一个java大佬,这个大佬在我给他描述问题的时候,说到搜索一个汉字变蓝三个,数字和字母没有问题的时候,大佬就知道哪的错误了,因为他说正常使用utf-8编码,一个汉字是占三个字节,这就是为什么是汉字最后三倍渲染加蓝,输入两个字最后的结果就是六个字加蓝。

2.所以这个bug本质的问题还是编码方面的知识,无关方面和语言,还是个人积累的知识量不够多,下去好好再学学编码方面的底层原理。

你真的懂 Unicode 和 UTF-8 是什么关系吗?来看看这个就彻底懂了!_unicode和utf8的关系-优快云博客上面是我觉的一篇写的特别好的文章,详细的讲了UTF-8,UTF-16,UTF-32,ASCII码,Unicode底层原理以及它们之间的关系,这个问题我在字节一面的时候面试官也详细问过很多。

3.面试的原问题:先问了Unicode和ASCII码是什么,后面又问了UTF-8,UTF-16,UTF-32这些和Unicode有什么关系,最后又详细问了UTF-8的底层原理。

答案:Unicode是一个字符集标准,ASCII则是Unicode的一个子集,包含最基本的字符,而UTF-8、UTF-16和UTF-32是实现Unicode这个标准的不同编码方式,UTF-8的底层原理参考上面我推荐的文章,我这里就不做详细的解释了。

感悟

之所以写这篇文章是因为面字节的时候问到了,我简历上也没写,没想到面试官会问到,我这个问题回答的特别好,面试官也说挺好的,但复活赛的二面还是挂了(之前三面挂了,另外一个部门给我捞起来了),刚好解决过这个bug后面详细的学习了一下编码的底层原理,要不然可能真的不会,同时这个bug也让我认识到了自己和大佬的差距,知识含量不是一个量级的,最后给大家一个真心的建议,平时学习的时候,不要会用就行了,多敲一敲小的demo,深入学习底层原理。

最后,如果觉得我的文章对你有帮,请点赞收藏加关注,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值