开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 1099|回复: 14
收起左侧

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

 关闭 [复制链接]
结帖率:92% (208/227)
发表于 2024-7-9 18:45:40 | 显示全部楼层 |阅读模式   广西壮族自治区崇左市
152精币
用这两个命令,都出现了判断错误的


.版本 2
.支持库 spec

.子程序 _临时子程序

调试输出 (是否为UTF8 (编码_Ansi到Unicode (“我”, )))
调试输出 (文本_是否UTF8_汇编 (编码_Ansi到Unicode (“我”, )))

调试输出 (是否为UTF8 (编码_Ansi到Unicode (“路边”, )))
调试输出 (文本_是否UTF8_汇编 (编码_Ansi到Unicode (“路边”, )))

调试输出 (是否为UTF8 (编码_Ansi到Unicode (“)”, )))
调试输出 (文本_是否UTF8_汇编 (编码_Ansi到Unicode (“)”, )))


.子程序 文本_是否UTF8_汇编, 逻辑型, , utf8编码返回真, 其他编码返回假, 支持多线程; 感谢【@jr21066
.参数 参_内容, 字节集

.如果真 (参_内容 = {  })
    返回 (假)
.如果真结束
置入代码 ({ 86, 87, 83, 139, 69, 8, 139, 24, 139, 75, 4, 139, 48, 131, 198, 8, 139, 67, 8, 37, 255, 255, 255, 0, 61, 191, 187, 239, 0, 116, 101, 172, 138, 224, 60, 127, 118, 88, 192, 232, 6, 60, 6, 117, 19, 172, 80, 192, 232, 6, 60, 2, 117, 74, 88, 192, 232, 7, 60, 0, 116, 70, 235, 62, 138, 196, 192, 232, 4, 60, 14, 117, 18, 172, 192, 232, 6, 60, 2, 117, 47, 172, 192, 232, 6, 60, 2, 117, 39, 235, 41, 138, 196, 192, 232, 3, 60, 30, 117, 28, 172, 192, 232, 6, 60, 2, 117, 20, 172, 192, 232, 6, 60, 2, 117, 12, 172, 192, 232, 6, 60, 2, 117, 4, 235, 6, 226, 159, 51, 192, 235, 3, 51, 192, 64, 91, 95, 94, 201, 194, 4, 0 })
返回 (假)

.子程序 是否为UTF8, 逻辑型, 公开, 如果为UTF8编码返回真,不是UTF8或空文本都返回假
.参数 参_文件内容, 字节集
.局部变量 文件长度, 整数型
.局部变量 取出位置, 整数型
.局部变量 循环取出内容, 字节集
.局部变量 循环取出数值, 整数型
.局部变量 返回值, 整数型
.局部变量 次数, 整数型


文件长度 = 取字节集长度 (参_文件内容)
次数 = 0
.判断开始 (文件长度 ≤ 0)
    返回 (假)
.默认

.判断结束
取出位置 = 1
.判断循环首 (取出位置 ≤ 文件长度)
    循环取出内容 = 取字节集中间 (参_文件内容, 取出位置, 1)
    循环取出数值 = 取字节集数据 (循环取出内容, 3, )
    .判断开始 (循环取出数值 > 127)
        返回值 = 0
    .默认

    .判断结束
    .判断开始 (次数 = 0)

        .判断开始 (循环取出数值 < 128)

        .默认

            .循环判断首 ()
                循环取出数值 = 汇编左移 (循环取出数值, 1)


                次数 = 次数 + 1
            .循环判断尾 (循环取出数值 > 127)
            次数 = 次数 - 1
            .判断开始 (次数 = 0)
                返回 (假)
            .默认

            .判断结束


        .判断结束

    .默认

        循环取出数值 = 位与 (循环取出数值, 192)  ' UTF8 3字节,后两位位与结果均是128
        .判断开始 (循环取出数值 = 128)
            次数 = 次数 - 1
        .默认

            返回 (假)

        .判断结束

    .判断结束

    取出位置 = 取出位置 + 1

.判断循环尾 ()
.判断开始 (次数 ≠ 0)
    返回 (假)
.判断 (返回值 = 0)
    返回 (真)
.默认

    返回 (假)
.判断结束


.子程序 汇编左移, 整数型, , 失败返回 -1
.参数 欲移动的整数, 整数型
.参数 欲移动的位数, 整数型



置入代码 ({ 81, 139, 69, 8, 139, 77, 12, 210, 224, 89, 139, 229, 93, 194, 8, 0 })

返回 (-1)


最佳答案

查看完整内容

完美: [e=0].版本 2 .子程序 字节集_是否为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, 223, 0, 0, 0, 139, 69, 8, 139, 0, 131, 192, 8, 3, 69, 236, 138, 8, 136, 77, 227, 131, 125, 248, 0, 15, 133, 152, 0, 0, 0, 15, 182, ...

点评

全面的判断是否UTF8汇编版 https://bbs.125.la/forum.php?mod=viewthread&tid=14827813   广东省佛山市  发表于 2024-7-10 15:09

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:100% (5/5)
发表于 2024-7-9 18:45:41 | 显示全部楼层   广东省佛山市
7ian 发表于 2024-7-9 21:00
判断一个字节序列是否为UTF-8格式,需要理解UTF-8编码的规则。UTF-8是一种可变长度的编码方式,它使用1到4 ...

完美:

  
子程序名返回值类型公开备 注
字节集_是否为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, 223, 0, 0, 0, 139, 69, 8, 139, 0, 131, 192, 8, 3, 69, 236, 138, 8, 136, 77, 227, 131, 125, 248, 0, 15, 133, 152, 0, 0, 0, 15, 182, 69, 227, 131, 248, 127, 127, 9, 15, 182, 69, 227, 131, 248, 32, 125, 27, 15, 182, 69, 227, 131, 248, 13, 116, 18, 15, 182, 69, 227, 131, 248, 10, 116, 9, 15, 182, 69, 227, 131, 248, 9, 117, 2, 235, 162, 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, 131, 15, 182, 69, 227, 61, 224, 0, 0, 0, 124, 23, 15, 182, 69, 227, 61, 239, 0, 0, 0, 127, 12, 199, 69, 248, 2, 0, 0, 0, 233, 97, 255, 255, 255, 15, 182, 69, 227, 61, 240, 0, 0, 0, 124, 23, 15, 182, 69, 227, 61, 244, 0, 0, 0, 127, 12, 199, 69, 248, 3, 0, 0, 0, 233, 63, 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, 21, 255, 255, 255, 48, 192, 235, 39, 233, 12, 255, 255, 255, 131, 125, 248, 0, 117, 12, 199, 133, 19, 255, 255, 255, 1, 0, 0, 0, 235, 10, 199, 133, 19, 255, 255, 255, 0, 0, 0, 0, 138, 133, 19, 255, 255, 255, 201, 194, 8, 0 })
返回 ()

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:100% (28/28)

签到天数: 7 天

发表于 2024-7-9 18:52:44 | 显示全部楼层   河南省新乡市
试下这个,我看我这个和你的汇编代码不一样
  
子程序名返回值类型公开备 注
文本_是否UTF8_汇编逻辑型 @jr21066
参数名类 型参考可空数组备 注
参_内容字节集
变量名类 型静态数组备 注
局_返回值逻辑型 
置入代码 ({ 96, 139, 69, 8, 139, 24, 139, 75, 4, 139, 48, 131, 198, 8, 139, 67, 8, 37, 255, 255, 255, 0, 61, 191, 187, 239, 0, 116, 101, 172, 136, 196, 60, 127, 118, 88, 192, 232, 6, 60, 6, 117, 19, 172, 80, 192, 232, 6, 60, 2, 117, 74, 88, 192, 232, 7, 60, 0, 116, 70, 235, 62, 136, 224, 192, 232, 4, 60, 14, 117, 18, 172, 192, 232, 6, 60, 2, 117, 47, 172, 192, 232, 6, 60, 2, 117, 39, 235, 41, 136, 224, 192, 232, 3, 60, 30, 117, 28, 172, 192, 232, 6, 60, 2, 117, 20, 172, 192, 232, 6, 60, 2, 117, 12, 172, 192, 232, 6, 60, 2, 117, 4, 235, 6, 226, 159, 49, 192, 235, 3, 49, 192, 64, 137, 69, 252, 97 })
返回 (局_返回值)
回复

使用道具 举报

结帖率:100% (28/28)

签到天数: 7 天

发表于 2024-7-9 18:55:53 | 显示全部楼层   河南省新乡市
如果还是不行试一下我写的这个
  
子程序名返回值类型公开备 注
问号_判断是否utf8逻辑型 bilibili憨憨问号
参数名类 型参考可空数组备 注
目标文本文本型
变量名类 型静态数组备 注
临时文本型 
临时 = 编码_UTF8到Ansi (到字节集 (目标文本))
如果 (临时 = “”)
返回 ()
如果真 (寻找文本 (临时, “?”, , ) = -1)
返回 ()

返回 ()
子程序名返回值类型公开备 注
编码_UTF8到Ansi文本型 UTF-8 to ANSI
参数名类 型参考可空数组备 注
UTF_8Date字节集
变量名类 型静态数组备 注
len整数型 
UnicodeBin字节集 
ll  
ansi_len整数型 
unicode_len  
ansi文本型 
ll = 取字节集长度 (UTF_8Date)
len = MultiByteToWideChar (65001, 0, UTF_8Date, ll, {  }, 0)
UnicodeBin = 取空白字节集 (len × 2)
MultiByteToWideChar (65001, 0, UTF_8Date, ll, UnicodeBin, len × 2)
unicode_len = 取字节集长度 (UnicodeBin) ÷ 2
ansi_len = WideCharToMultiByte (936, 0, UnicodeBin, unicode_len, ansi, 0, “”, 0)
ansi = 取空白文本 (ansi_len)
WideCharToMultiByte (936, 0, UnicodeBin, unicode_len, ansi, ansi_len, “”, 0)
返回 (ansi)

补充内容 (2024-7-9 18:56):
.版本 2

.DLL命令 WideCharToMultiByte, 整数型, "kernel32.dll", "WideCharToMultiByte"
    .参数 CodePage, 整数型
    .参数 dwFlags, 整数型
    .参数 lpWideCharStr, 字节集
    ....
回复

使用道具 举报

结帖率:100% (28/28)

签到天数: 7 天

发表于 2024-7-9 18:56:41 | 显示全部楼层   河南省新乡市
憨憨问号 发表于 2024-7-9 18:55
如果还是不行试一下我写的这个[e=2].版本 2

.子程序 问号_判断是否utf8, 逻辑型, , bilibili憨憨问号

dll忘记了
.版本 2

.DLL命令 WideCharToMultiByte, 整数型, "kernel32.dll", "WideCharToMultiByte"
    .参数 CodePage, 整数型
    .参数 dwFlags, 整数型
    .参数 lpWideCharStr, 字节集
    .参数 cchWideChar, 整数型
    .参数 lpMultiByteStr, 文本型
    .参数 cbMultiByte, 整数型
    .参数 lpDefaultChar, 文本型
    .参数 lpUsedDefaultChar, 整数型

.DLL命令 MultiByteToWideChar, 整数型, "Kernel32.dll", "MultiByteToWideChar"
    .参数 CodePage, 整数型
    .参数 dwFlags, 整数型
    .参数 lpMultiByteStr, 字节集
    .参数 cchMultiByte, 整数型
    .参数 lpWideCharStr, 字节集
    .参数 cchWideChar, 整数型
回复

使用道具 举报

结帖率:92% (208/227)
 楼主| 发表于 2024-7-9 19:05:05 | 显示全部楼层   广西壮族自治区崇左市
憨憨问号 发表于 2024-7-9 18:52
试下这个,我看我这个和你的汇编代码不一样
  
[/quote]
这个汇编都一样判断不了  路边  这个
utf8到ansi,如果是单字符,一样会错误。
[e=3]调试输出 (问号_判断是否utf8 (AnsiToUnicode_yc (“asd”, , )))

回复

使用道具 举报

结帖率:92% (208/227)
 楼主| 发表于 2024-7-9 19:05:59 | 显示全部楼层   广西壮族自治区崇左市
憨憨问号 发表于 2024-7-9 18:55
如果还是不行试一下我写的这个[e=2].版本 2

.子程序 问号_判断是否utf8, 逻辑型, , bilibili憨憨问号

单字符的,判断失败。双字符用这个还行
回复

使用道具 举报

结帖率:100% (28/28)

签到天数: 7 天

发表于 2024-7-9 19:08:04 | 显示全部楼层   河南省新乡市
police0909 发表于 2024-7-9 19:05
单字符的,判断失败。双字符用这个还行

前面加个判断,如果是单字符在后面加1字符的空格 → “ ”,结果出来再给他删了
回复

使用道具 举报

发表于 2024-7-9 19:33:15 | 显示全部楼层   陕西省西安市
憨憨问号 发表于 2024-7-9 18:55
如果还是不行试一下我写的这个[e=2].版本 2

.子程序 问号_判断是否utf8, 逻辑型, , bilibili憨憨问号

这么写的话,如果待判断的utf编码字符本身有?号会被判断为假
回复

使用道具 举报

发表于 2024-7-9 19:45:28 | 显示全部楼层   陕西省西安市
  
子程序名返回值类型公开备 注
是否UTF8编码逻辑型 判断字符是不是UTF-8类型
参数名类 型参考可空数组备 注
字符串文本型
变量名类 型静态数组备 注
计次  
字节数  
字符  
全是Ascii逻辑型 
长度  
待判断字节集 
待判断 = 到字节集 (字符串)
字节数 = 0
全是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
返回 ()
返回 ()



补充内容 (2024-7-9 19:47):
全是Ascii时,utf8和gbk等编码完全一样
回复

使用道具 举报

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

本版积分规则 致发广告者

关闭

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

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

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

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