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