字符编码
文章平均质量分 53
介绍主流的字符集(Unicode、GBK/GB2312、Ascii等)、字符编码(utf-x,GBK,Ascii等)的关系。
此外记录字符编码相关的转换类、函数等。
小黑屋1024
这个作者很懒,什么都没留下…
展开
-
字符、字符集、编码
所以就可能会发生冲突(比如前面说到的“啊”的区号+位 为0x1001,直接转为国际码,则会被认为是ASCII的0x10 0x01两个字符,而失去本身的含义)。在计算机中,所有的内容都是以二进制数据存储的,而我们在屏幕上看到的字和符号以及看不到的字符都是二进制数据转换后的结果。比较特殊的是UNICODE字符集,有UTF-8,UTF-16,UTF-32三种编码方式。依旧采用2字节,是对GB2312的扩展,不在限制第二字节必须大于127,同时只要第一个字节大于0x80,就认为是GBK的开始。原创 2023-06-27 19:42:31 · 360 阅读 · 0 评论 -
vs中的一些编码问题
对于上述的代码,运行时断点可以看到s的具体数据内容,比如GB2312编码是0xD2BB,而如果是UTF-8编码的话则是0xE4B880。前面提到通过改变文件保存编码格式,可以将中文字符串以UTF-8格式保存到运行时,但是并不稳妥。尤其是当我们设置了/source-charset-utf-8选项后,不论文件是什么格式,数据都是GB2312格式。按不同的编码格式保存后,通过16进制文件查看器,可以看到中文的编码是能对应上的。在字符串前面加上u8,表示让编译器将后面的字符串以UTF-8的格式保存到数据中。原创 2023-06-27 19:43:28 · 1080 阅读 · 0 评论 -
unicode-utf8转换
unicode2Utf8函数将unicode值转为对应的utf8编码的字符串。utf82Unicode函数将utf8编码的字符串转为unicode值。两个函数性能都经过测试验证,目前是我能够优化的极限。两者的转换原理则依据下表(详情参考。Unicode码位范围。utf-8编码二进制。原创 2023-06-27 20:01:02 · 693 阅读 · 0 评论 -
判断字符串编码是GBK还是UTF-8
对于中文‘鍟’的GBK编码时0xE595,而中文‘夽’的GBK编码时0x8A40,那么按照UTF-8的解析,会将这四个字节0xEA958A40,分成0xEA 95 8A 和0x40两个,对应UTF-8的中文‘啊’以及‘@’两个字符。),主要是通过字节数据的范围判断,且由于GBK的每个字节都在UTF-8的范围内,所以需要先判断是否为UTF-8,然后再判断是否为GBK。然而这样还是会出问题。然后关于第一点,如何通过字节数据层面判断是GBK还是Unicode字符集(UTF-8编码)?类似的场景还是有很多的。原创 2023-06-27 19:58:58 · 1571 阅读 · 0 评论 -
EasyString类(切分utf8编码的string)
EasyString类主要功能是将utf8编码的std::string切分,使得能够统计字符数(通过size函数)并能获取到各字符内容(通过at函数)。QString用多了之后真心觉得std::string太原始。刚好有个切分utf8字符串的需求,所以简单封装了一个字符串类。核心函数为utf8TextLen函数,计算当前字符占几个字节,从而进行切分。其中使用了两种计算方式,性能上并没有太大区别。目前EasyString只是一个简单的类,提供的功能也很有限,后续有需要时继续完善。原创 2023-06-27 19:37:17 · 101 阅读 · 0 评论