编码-如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码

需求定制 需求定制 主题:1050 回复:2283

编码-如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码

泛泛之交 发布于 2016-10-19 字数 71 浏览 1368 回复 3

程序在处理文本的时候如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

浮生未歇 2017-05-30 3 楼

严格区分是不可能的,但是在数据量比较大的情况下还是可以分辨出无bom的utf8的,按照它的编码规则一个个检查过去就行了。

夜无邪 2017-05-19 2 楼

ansi在大陆就是GBK或者GB2312,2字节一个汉字,UTF8 3字节一个汉字
算法网上搜的,基本可用

unsigned int countGBK(const char * str)
{
assert(str != NULL);
unsigned int len = (unsigned int)strlen (str);
unsigned int counter = 0;
unsigned char head = 0x80;
unsigned char firstChar, secondChar;

for (unsigned int i = 0; i < len - 1; ++i)  
{  
    firstChar = (unsigned char)str[i];  
    if (!(firstChar & head))continue;  
    secondChar = (unsigned char)str[i];  
    if (firstChar >= 161 && firstChar <= 247 && secondChar>=161 && secondChar <= 254)  
    {  
        counter+= 2;  
        ++i;  
    }  
}  
return counter;  

}

unsigned int countUTF8(const char * str)
{
assert(str != NULL);
unsigned int len = (unsigned int)strlen (str);
unsigned int counter = 0;
unsigned char head = 0x80;
unsigned char firstChar;
for (unsigned int i = 0; i < len; ++i)
{
firstChar = (unsigned char)str[i];
if (!(firstChar & head))continue;
unsigned char tmpHead = head;
unsigned int wordLen = 0 , tPos = 0;
while (firstChar & tmpHead)
{
++ wordLen;
tmpHead >>= 1;
}
if (wordLen <= 1)continue; //utf8最小长度为2
wordLen --;
if (wordLen + i >= len)break;
for (tPos = 1; tPos <= wordLen; ++tPos)
{
unsigned char secondChar = (unsigned char)str[i + tPos];
if (!(secondChar & head))break;
}
if (tPos > wordLen)
{
counter += wordLen + 1;
i += wordLen;
}
}
return counter;
}

bool beUtf8(const char *str)
{
<span style="white-space:pre"> </span>unsigned int iGBK = countGBK(str);
unsigned int iUTF8= countUTF8(str);
if (iUTF8 > iGBK)return true;
return false;
}

偏爱自由 2017-04-08 1 楼

在简体中文系统下,ANSI 编码代表 GB2312 编码,utf8和GB2312如何识别的方法,你可以参考下 PHP JavaScript http协议 如何高效、准确、自动识别网页编码