美丽心灵公益论坛

查看: 2903|回复: 7

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

[复制链接]
累计签到:46 天
连续签到:10 天

67

主题

1071

回帖

6111

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6111
Starrry 发表于 2022-2-1 22:45:37| 字数 68 | 显示全部楼层 |阅读模式
本帖最后由 Starrry 于 2022-2-4 10:43 编辑

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

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





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
累计签到:3 天
连续签到:1 天

463

主题

5098

回帖

2万

积分

超级版主

Rank: 8Rank: 8

积分
23605

最佳新人活跃会员发帖达人

最佳新人
蓝莓糖 发表于 2022-2-2 11:23:33| 字数 12 | 显示全部楼层
不太懂啊,楼主揭晓答案吧
累计签到:46 天
连续签到:10 天

67

主题

1071

回帖

6111

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6111
 楼主| Starrry 发表于 2022-2-2 11:53:12| 字数 629 | 显示全部楼层
本帖最后由 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

  1.      cmp     dl, 011110000b
  2.      jae     _4byte
  3.      cmp    dl, 011100000b
  4.      jae      _3byte
  5.      cmp    dl, 011000000b
  6.      jae      _2byte
  7.      cmp     dl, 001111111b
  8.      jbe     _1byte
  9.      
  10.    ;the others are continuation byte, don't count
复制代码







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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
累计签到:3 天
连续签到:1 天

463

主题

5098

回帖

2万

积分

超级版主

Rank: 8Rank: 8

积分
23605

最佳新人活跃会员发帖达人

最佳新人
蓝莓糖 发表于 2022-2-2 11:56:22| 字数 27 | 显示全部楼层
ganbatte是什么意思,为什么下边有红色的波浪线?
累计签到:46 天
连续签到:10 天

67

主题

1071

回帖

6111

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6111
 楼主| Starrry 发表于 2022-2-2 11:58:16| 字数 113 | 显示全部楼层
蓝莓糖 发表于 2022-2-2 11:56
ganbatte是什么意思,为什么下边有红色的波浪线?

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

Ganbatte是日语里“加油”的意思。
累计签到:3 天
连续签到:1 天

463

主题

5098

回帖

2万

积分

超级版主

Rank: 8Rank: 8

积分
23605

最佳新人活跃会员发帖达人

最佳新人
蓝莓糖 发表于 2022-2-2 12:00:22| 字数 106 | 显示全部楼层
Starrry 发表于 2022-2-2 11:58
下面有红线是因为浏览器检查英文拼音时认为ganbatte是错别字(Spell checker).

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

原来是这样,日语还能用英文字母表达
累计签到:1463 天
连续签到:5 天

521

主题

6310

回帖

519万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5198236

活跃会员热心会员发帖达人最佳新人

活跃会员
simonzhd 发表于 2022-2-2 22:58:54| 字数 4 来自手机 | 显示全部楼层
长知识了
累计签到:46 天
连续签到:10 天

67

主题

1071

回帖

6111

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6111
 楼主| Starrry 发表于 2022-2-2 23:00:16| 字数 48 | 显示全部楼层

替你开心,是应该普及UTF-8的知识的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|免责及版权声明|关于|美丽心灵公益论坛

GMT+8, 2025-8-11 08:29 , Processed in 0.059841 second(s), 29 queries .

Powered by Discuz! X3.4

!copyright!

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