开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

12
返回列表 发新帖
楼主: police0909
收起左侧

[已解决] 有没有真正判断文本是否为utf8文本的方式呢?

 关闭 [复制链接]
发表于 2024-7-9 20:00:59 | 显示全部楼层   陕西省西安市
  
调试输出 (是否UTF8编码 (“我”))
调试输出 (是否UTF8编码 (“路边”))
调试输出 (是否UTF8编码 (“5646”, ))
调试输出 (是否UTF8编码 (“5646”))
调试输出 (是否UTF8编码 (编码_gb2312到utf8 (“路边”)))
子程序名返回值类型公开备 注
是否UTF8编码逻辑型 判断字符是不是UTF-8类型
参数名类 型参考可空数组备 注
字符串文本型
全Ascii不当成Utf8逻辑型
变量名类 型静态数组备 注
计次  
字节数  
字符  
全是Ascii逻辑型 
长度  
待判断字节集 
待判断 = 到字节集 (字符串)
长度 = 取字节集长度 (待判断)
字节数 = 0
如果 (全Ascii不当成Utf8)
全是Ascii = 真
全是Ascii = 假
判断循环首 (计次 < 长度)
计次 = 计次 + 1
字符 = 待判断 [计次]
如果真 (字符 ≤ 57 字符 ≥ 48)  ' 0-9
到循环尾 ()
如果真 (字符 ≤ 122 字符 ≥ 97)  ' a-z
到循环尾 ()
如果真 (字符 ≤ 90 字符 ≥ 65)  ' A-Z
到循环尾 ()
如果真 (位与 (字符, 128) ≠ 0)
全是Ascii = 假
如果 (字节数 = 0)  ' //如果不是ASCII码,应该是多字节符,计算字节数
如果 (字符 ≥ 128)
判断 (字符 ≥ 252 字符 ≤ 253)
字节数 = 6
判断 (字符 ≥ 248)
字节数 = 5
判断 (字符 ≥ 240)
字节数 = 4
判断 (字符 ≥ 224)
字节数 = 3
判断 (字符 ≥ 192)
字节数 = 2



返回 ()
' 调试输出 (字节数)
字节数 = 字节数 - 1
如果真 (位与 (字符, 192) ≠ 128)
返回 ()
字节数 = 字节数 - 1

' //多字节符的非首字节,应为 10xxxxxx
如果真 (位与 (字符, 192) ≠ 128)
返回 ()

字节数 = 字节数 - 1

判断循环尾 ()
如果真 (字节数 > 0)  ' //违返规则
返回 ()
如果真 (全是Ascii)  ' //如果全部都是ASCII, 说明不是UTF-8
返回 ()
返回 ()


i支持库列表   支持库注释   
spec特殊功能支持库



补充内容 (2024-7-9 20:03):
调试输出 (是否UTF8编码 (到文本 (编码_Ansi到Unicode (“路边”))))

补充内容 (2024-7-9 20:05):
如果有判断失误的例子请回复下
回复

使用道具 举报

结帖率:100% (5/5)
发表于 2024-7-9 21:00:42 | 显示全部楼层   广东省佛山市

判断一个字节序列是否为UTF-8格式,需要理解UTF-8编码的规则。UTF-8是一种可变长度的编码方式,它使用1到4个字节来表示一个Unicode字符。根据UTF-8的编码规则,一个字节序列是有效的UTF-8格式,当且仅当它满足以下条件:

  • 单字节的字符必须具有0xxxxxxx的模式(即最高位为0)。
  • 多字节的字符序列的第一个字节以1开头,后续字节以10开头。
  • 具体来说,对于多字节字符:
    • 两个字节序列的第一个字节以110xxxxx开头,第二个字节以10xxxxxx开头。
    • 三个字节序列的第一个字节以1110xxxx开头,第二个和第三个字节以10xxxxxx开头。
    • 四个字节序列的第一个字节以11110xxx开头,第二个、第三个和第四个字节以10xxxxxx开头。



用汇编写了个,测试了下还不错,别人的测试不通过的情况是:前面是UTF8 后面不是 的情况也是返回真

  
子程序名返回值类型公开备 注
字节集_是否为UFT8逻辑型 by.7ian.541980200
参数名类 型参考可空数组备 注
数据字节集
长度整数型
置入代码 ({ 199, 69, 248, 0, 0, 0, 0, 199, 69, 236, 0, 0, 0, 0, 235, 9, 139, 69, 236, 131, 192, 1, 137, 69, 236, 139, 69, 236, 59, 69, 12, 15, 131, 180, 0, 0, 0, 139, 69, 8, 139, 0, 131, 192, 8, 3, 69, 236, 138, 8, 136, 77, 227, 131, 125, 248, 0, 117, 113, 15, 182, 69, 227, 131, 248, 127, 127, 2, 235, 202, 15, 182, 69, 227, 61, 194, 0, 0, 0, 124, 20, 15, 182, 69, 227, 61, 223, 0, 0, 0, 127, 9, 199, 69, 248, 1, 0, 0, 0, 235, 171, 15, 182, 69, 227, 61, 224, 0, 0, 0, 124, 20, 15, 182, 69, 227, 61, 239, 0, 0, 0, 127, 9, 199, 69, 248, 2, 0, 0, 0, 235, 140, 15, 182, 69, 227, 61, 245, 0, 0, 0, 124, 23, 15, 182, 69, 227, 61, 244, 0, 0, 0, 127, 12, 199, 69, 248, 3, 0, 0, 0, 233, 106, 255, 255, 255, 48, 192, 235, 81, 235, 40, 15, 182, 69, 227, 61, 128, 0, 0, 0, 124, 25, 15, 182, 69, 227, 61, 191, 0, 0, 0, 127, 14, 139, 69, 248, 131, 232, 1, 137, 69, 248, 233, 64, 255, 255, 255, 48, 192, 235, 39, 233, 55, 255, 255, 255, 131, 125, 248, 0, 117, 12, 199, 133, 24, 255, 255, 255, 1, 0, 0, 0, 235, 10, 199, 133, 24, 255, 255, 255, 0, 0, 0, 0, 138, 133, 24, 255, 255, 255, 201, 194, 8, 0 })
返回 ()



补充内容 (2024-7-9 21:11):
你给的那几个Unicode只有“我”是符合utf8的,所以这种情况很难判断 ,比如“你我她飞”都是
回复

使用道具 举报

结帖率:92% (208/227)
 楼主| 发表于 2024-7-10 22:23:42 | 显示全部楼层   广西壮族自治区崇左市
anyuezhiji 发表于 2024-7-9 20:00
[e=0].版本 2
.支持库 spec

.版本 2
.支持库 spec

数据 = 编码_Ansi到Utf8_yc (字符 (#Tab键), )
启动 = 取启动时间 ()

.计次循环首 (10, )
    结果3 = 是否UTF8编码 (数据, )

.计次循环尾 ()
调试输出 (取启动时间 () - 启动, 结果3)
这个判断会失败
回复

使用道具 举报

结帖率:92% (208/227)
 楼主| 发表于 2024-7-10 22:31:26 | 显示全部楼层   广西壮族自治区崇左市
anyuezhiji 发表于 2024-7-9 20:00
[e=0].版本 2
.支持库 spec

好像包含有单字符的符号,就会判断错误。

比如“士大夫.”
回复

使用道具 举报

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

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /1 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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