怎么快速判断字符集是utf-8还是gb2312

ert12qwe 2013-08-07 11:12:30
在linux下用C编写一个函数,该字符串是utf-8还是gb2312,求大神帮忙
...全文
677 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-08-22
  • 打赏
  • 举报
回复
sizeof和strlen和wcslen和_mbslen和_mbstrlen不是一回事!
lm_whales 2013-08-22
  • 打赏
  • 举报
回复
引用 11 楼 szszszcw 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] strlen("汉")的值是2,表示“汉”在内存中是以gb2312或gbk或utf16保存的; strlen("汉")的值是3,表示“汉”在内存中是以utf-8编码保存的。
我测试了一下: printf("sizeof = %d len = %d\n",sizeof("汉"),strlen("汉")); 其中:sizeof(“汉”)的值怎么会是 3呢?sizeof的值要么是1或2,要么是4这样的数。好像没听说过有 3的?? 字符串会没有结束符吗???结束符不占空间???? 另外:strlen("汉")为2。说明它占两个字节。。但sizeof()测出的值为什么会是3呢?sizeof怎么测出占3个字节???? [/quote] sizeof(“汉”) 获取常量字符数组,占用的空间, MBCS系统,每个字符1字节,每个汉字,算两个字符,结束符,一个字符, 应该是,2 + 1 = 3, sizeof(L“汉”) UNICODE 16,每个字符1字节,汉字算一个字符,结束符, 一个字符, 应该是 2 + 2 = 4。 utf-8,是编码字节数+1
赵4老师 2013-08-08
  • 打赏
  • 举报
回复
参考下面: //GBK汉字内码范围(不包括A1xx~A9xx的标点符号英文字母特殊符号等) //区码 ,位码 //81-A0 ,40-7E 80-FE //AA-AF ,40-7E 80-A0 //B0-D6 ,40-7E 80-FE //D7 ,40-7E 80-F9 //D8-F7 ,40-7E 80-FE //F8-FE ,40-7E 80-A0 -------------------------------- 'UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所 '有文字和符号种类加起来也只要编到 4个字节长就够了。 '  UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一 '点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字 '节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这 '些连续“1”称为标记位),表示转换成几个字节:“110”连续两个 '“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110” '则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和 '字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标 '记,剩下的6个位才做为字符码位使用。 '  这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的 '原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字 '符码,由此类推。编码方式的模板如下: ' '原始码(16进制) UTF-8编码(二进制) '-------------------------------------------- '0000 - 007F 0xxxxxxx '0080 - 07FF 110xxxxx 10xxxxxx '0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx '…… '-------------------------------------------- ' '  模板中的“x”表示字符码。 '汉字的 Unicode编码范围为0800-FFFF,所以被编为 '3个字节的UTF-8码。 '  例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以 '要用3个字节的模板:1110xxxx 10xxxxxx 10xxxxxx。 '  UTF-8文本文件与Unicode文本文件类似,在文件的头部也有标记字 '节,Unicode文件的标记是2个字节:&HFF 和 &HFE,UTF-8文件的标记 '是3个字节:&HEF、&HBB 和 &HBF
ert12qwe 2013-08-08
  • 打赏
  • 举报
回复
我是在URL里面获取关键字,但是发现有的url中没有utf-8的标志但还是utf-8,有的是gb2312,所以很纠结怎么样更好的判断是哪个字符集。。
FancyMouse 2013-08-08
  • 打赏
  • 举报
回复
搬凳子看忽悠
mujiok2003 2013-08-07
  • 打赏
  • 举报
回复
不能判断,字符串就是一个缓冲区,要怎么正确理解其中的内容只有你知道。
图灵狗 2013-08-07
  • 打赏
  • 举报
回复
取决于系统的locale设定,一般为utf-8编码。
szszszcw 2013-08-07
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
strlen("汉")的值是2,表示“汉”在内存中是以gb2312或gbk或utf16保存的;
strlen("汉")的值是3,表示“汉”在内存中是以utf-8编码保存的。


我测试了一下:
printf("sizeof = %d len = %d\n",sizeof("汉"),strlen("汉"));

其中:sizeof(“汉”)的值怎么会是 3呢?sizeof的值要么是1或2,要么是4这样的数。好像没听说过有 3的??

另外:strlen("汉")为2。说明它占两个字节。。但sizeof()测出的值为什么会是3呢?sizeof怎么测出占3个字节????
zhctj159 2013-08-07
  • 打赏
  • 举报
回复
引用 8 楼 h1986zh 的回复:
引用 7 楼 zhctj159 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 zhctj159 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
有问题吧,应该用sizeof
不应该用sizeof[/quote]strlen也不对呀strlen("汉")的值是2[/quote] 不应该用sizeof,strlen值为2,说明是db2312[/quote]
引用 9 楼 zhao4zhong1 的回复:
strlen("汉")的值是2,表示“汉”在内存中是以gb2312或gbk或utf16保存的; strlen("汉")的值是3,表示“汉”在内存中是以utf-8编码保存的。
不错,是我糊涂了
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
strlen("汉")的值是2,表示“汉”在内存中是以gb2312或gbk或utf16保存的; strlen("汉")的值是3,表示“汉”在内存中是以utf-8编码保存的。
h1986zh 2013-08-07
  • 打赏
  • 举报
回复
引用 7 楼 zhctj159 的回复:
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 zhctj159 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
有问题吧,应该用sizeof
不应该用sizeof[/quote]strlen也不对呀strlen("汉")的值是2[/quote] 不应该用sizeof,strlen值为2,说明是db2312
zhctj159 2013-08-07
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
引用 5 楼 zhctj159 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
有问题吧,应该用sizeof
不应该用sizeof[/quote]strlen也不对呀strlen("汉")的值是2
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
引用 5 楼 zhctj159 的回复:
引用 4 楼 zhao4zhong1 的回复:
if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
有问题吧,应该用sizeof
不应该用sizeof
zhctj159 2013-08-07
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
有问题吧,应该用sizeof
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
if (3==strlen("汉")) printf("utf-8\n"); else printf("gb2312\n");
赵4老师 2013-08-07
  • 打赏
  • 举报
回复
一个汉字占三个字节的话就是utf-8,两个字节的话可能是UTF16或gb2312

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧