Starrry 发表于 2022-2-1 22:45:37

考一考你:如何计算UTF-8文本文件里有多少字符?

本帖最后由 Starrry 于 2022-2-4 10:43 编辑

UTF-8字符最短1字节,最长4字节。

如何计算?如果排序不对,又如何检测出来呢?





蓝莓糖 发表于 2022-2-2 11:23:33

不太懂啊,楼主揭晓答案吧

Starrry 发表于 2022-2-2 11:53:12

本帖最后由 Starrry 于 2022-2-2 12:45 编辑

蓝莓糖 发表于 2022-2-2 11:23
不太懂啊,楼主揭晓答案吧
没问题,先简单叙述一下:

4字节的UTF-8都是以1111 xxxx 开始的
3字节的UTF-8是以1110 xxxx 开始的
2字节的UTF-8是以1100 xxxx 开始的
1字节的UTF-8(也就是ASCII)是以0开始的,如01111 1111.
只剩下10xx xxxx,也就是Continuation Byte,是那些2~4字节后面的组成成分。

这么一来,这个方程式就一目了然,如:

if code>=011110000b then
      goto _4byte
else if code>=011100000b then
      goto _3byte
else if code>=011000000b then
      goto _2byte
else if code<=01111111b then
      goto _1byte
else
         // it is continuation byte, ignore it

   cmp   dl, 011110000b
   jae   _4byte
   cmp    dl, 011100000b
   jae      _3byte
   cmp    dl, 011000000b
   jae      _2byte
   cmp   dl, 001111111b
   jbe   _1byte
   
   ;the others are continuation byte, don't count






0x28+0xD=53字节,比在线的显示结果(52字节)多了一个字节,那是因为文本文件结尾多了一个0xA(换行符)。

蓝莓糖 发表于 2022-2-2 11:56:22

ganbatte是什么意思,为什么下边有红色的波浪线?

Starrry 发表于 2022-2-2 11:58:16

蓝莓糖 发表于 2022-2-2 11:56
ganbatte是什么意思,为什么下边有红色的波浪线?

下面有红线是因为浏览器检查英文拼音时认为ganbatte是错别字(Spell checker).

Ganbatte是日语里“加油”的意思。

蓝莓糖 发表于 2022-2-2 12:00:22

Starrry 发表于 2022-2-2 11:58
下面有红线是因为浏览器检查英文拼音时认为ganbatte是错别字(Spell checker).

Ganbatte是日语里“加油” ...

原来是这样,日语还能用英文字母表达

simonzhd 发表于 2022-2-2 22:58:54

长知识了{:10_453:}

Starrry 发表于 2022-2-2 23:00:16

simonzhd 发表于 2022-2-2 22:58
长知识了

替你开心,是应该普及UTF-8的知识的。
页: [1]
查看完整版本: 考一考你:如何计算UTF-8文本文件里有多少字符?