编码-如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码
程序在处理文本的时候如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
程序在处理文本的时候如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
严格区分是不可能的,但是在数据量比较大的情况下还是可以分辨出无bom的utf8的,按照它的编码规则一个个检查过去就行了。
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;
}
在简体中文系统下,ANSI 编码代表 GB2312 编码,utf8和GB2312如何识别的方法,你可以参考下 PHP JavaScript http协议 如何高效、准确、自动识别网页编码