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

发布于 2016-10-19 21:50:36 字数 49 浏览 1677 评论 3

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(3

浮生未歇 2017-05-30 12:15:20

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

夜无邪 2017-05-19 21:33:18

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 14:27:02

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文