86339218 发表于 2023-10-15 14:40:16

火山PC 怎么判断一个txt是否为UTF8?

火山PC 怎么判断一个txt是否为UTF8?


: 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: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)
                {
                  返回 (假)// 不在有效字节的范围内
                }
            }
      }
      否则
      {
            返回 (假)
      }
    }
    返回 (真)
}

86339218 发表于 2023-10-15 16:09:07

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

好的我去看看模块
页: [1]
查看完整版本: 火山PC 怎么判断一个txt是否为UTF8?