递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 2803|回复: 2
打印 上一主题 下一主题

[视窗] 火山PC 怎么判断一个txt是否为UTF8?

[复制链接]

19

主题

84

帖子

407

积分

中级会员

Rank: 3Rank: 3

积分
407
跳转到指定楼层
楼主
发表于 2023-10-15 14:40:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
火山PC 怎么判断一个txt是否为UTF8?


[00000000]: 61 31 32 33 E6 88 91 E6 98 AF 55 54 46 2D 38    | a123......UTF-8
a123我是UTF-8

回复

使用道具 举报

26

主题

1900

帖子

6926

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6926
沙发
发表于 2023-10-15 15:52:00 | 只看该作者
UTF-8还是比较好判断的,要求效率的话,可以用第三方模块的功能,如:
PIV模块   simdUTF.验证UTF8 ()
火山模块  验证UTF8数据_ ()

如果不在乎效率,可以根据规则手写一个:

<火山程序 类型 = "通常" 版本 = 1 />

方法 是否UTF8 <公开 类型 = 逻辑型 折叠>
参数 数据 <类型 = 字节集类>
{
    变量 文本长度 <类型 = 整数>
    文本长度 = 数据.取字节集长度 ()
    如果 (文本长度 == 0)
    {
        返回 (假)
    }
    如果 (数据.取字节集数据 (文本长度 - 1, 字节) == 0)
    {
        文本长度 = 文本长度 - 1  // 去掉结尾0字符的长度
    }
    变量 索引 <类型 = 整数>
    变量 检验字节 <类型 = 字节>
    循环 (0, 文本长度, 索引, 1)
    {
        检验字节 = 数据.取字节集数据 (索引, 字节)
        如果 (检验字节 == 0)
        {
            返回 (假)  // 非尾部有0字符
        }
        如果 (位右移 (检验字节, 7) == 0)  // 1字节
        {
            到循环尾
        }
        否则 (检验字节 >= (字节)0xC0 && 检验字节 <= (字节)0xDF)  // 2字节
        {
            如果 (索引 + 1 > 文本长度)
            {
                返回 (假)  // 剩余长度不足
            }
            索引 = 索引 + 1
            检验字节 = 数据.取字节集数据 (索引, 字节)
            如果 (检验字节 < (字节)0x80 && 检验字节 > (字节)0xBF)
            {
                返回 (假) // 不在有效字节的范围内
            }
        }
        否则 (检验字节 >= (字节)0xE0 && 检验字节 <= (字节)0xEF)
        {
            如果 (索引 + 2 > 文本长度)
            {
                返回 (假)  // 剩余长度不足
            }
            计次循环 (2)
            {
                索引 = 索引 + 1
                检验字节 = 数据.取字节集数据 (索引, 字节)
                如果 (检验字节 < (字节)0x80 && 检验字节 > (字节)0xBF)
                {
                    返回 (假)  // 不在有效字节的范围内
                }
            }
        }
        否则 (检验字节 >= (字节)0xF0 && 检验字节 <= (字节)0xF7)
        {
            如果 (索引 + 4 > 文本长度)
            {
                返回 (假)  // 剩余长度不足
            }
            计次循环 (3)
            {
                索引 = 索引 + 1
                检验字节 = 数据.取字节集数据 (索引, 字节)
                如果 (检验字节 < (字节)0x80 && 检验字节 > (字节)0xBF)
                {
                    返回 (假)  // 不在有效字节的范围内
                }
            }
        }
        否则
        {
            返回 (假)
        }
    }
    返回 (真)
}
回复

使用道具 举报

19

主题

84

帖子

407

积分

中级会员

Rank: 3Rank: 3

积分
407
板凳
 楼主| 发表于 2023-10-15 16:09:07 | 只看该作者
Xelloss0618 发表于 2023-10-15 15:52
UTF-8还是比较好判断的,要求效率的话,可以用第三方模块的功能,如:
PIV模块   simdUTF.验证UTF8 ()
火山 ...

好的  我去看看模块
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 03:50 , Processed in 0.081832 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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