递归火山软件开发平台

标题: 火山PC 怎么判断一个txt是否为UTF8? [打印本页]

作者: 86339218    时间: 2023-10-15 14:40
标题: 火山PC 怎么判断一个txt是否为UTF8?
火山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


作者: Xelloss0618    时间: 2023-10-15 15:52
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)
                {
                    返回 (假)  // 不在有效字节的范围内
                }
            }
        }
        否则
        {
            返回 (假)
        }
    }
    返回 (真)
}

作者: 86339218    时间: 2023-10-15 16:09
Xelloss0618 发表于 2023-10-15 15:52
UTF-8还是比较好判断的,要求效率的话,可以用第三方模块的功能,如:
PIV模块   simdUTF.验证UTF8 ()
火山 ...

好的  我去看看模块




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4