免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 17296 | 回复: 17
打印 上一主题 下一主题

如何在c语言中操作UTF-8字符? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-03 10:03 |只看该作者 |倒序浏览
我需要在一个文件中读取所有的汉字,这些汉字都是utf8编码的。但是中文和英文的长度不同,我怎么才能判断一个字节开始,是汉字的开始,还是英文的开始,应该往后读取多少?

论坛徽章:
0
2 [报告]
发表于 2009-01-03 10:04 |只看该作者
我是在linux用gnu c,是不是还需要“wchar”或者“iconv”之类的库才可以?
哪位能指点一下,如果有例子更好~

论坛徽章:
0
3 [报告]
发表于 2009-01-03 10:17 |只看该作者
原帖由 cysin 于 2009-1-3 10:03 发表
我需要在一个文件中读取所有的汉字,这些汉字都是utf8编码的。但是中文和英文的长度不同,我怎么才能判断一个字节开始,是汉字的开始,还是英文的开始,应该往后读取多少?


读取这个字节后,如果ch >='a' && ch <='z' 那么就是英文字符,可以吗?

论坛徽章:
0
4 [报告]
发表于 2009-01-03 10:18 |只看该作者
如果怕是一些标点符号,再把这些标点符号的判断值加进去

论坛徽章:
0
5 [报告]
发表于 2009-01-03 10:23 |只看该作者
那你就去了解一下 UTF-8 的编码规则啊, 简单来说读取某个字节,  判断它是多字节的还是单字节的,甚至是多字节的非首字节...

论坛徽章:
0
6 [报告]
发表于 2009-01-03 10:27 |只看该作者
原帖由 hightman 于 2009-1-3 10:23 发表
那你就去了解一下 UTF-8 的编码规则啊, 简单来说读取某个字节,  判断它是多字节的还是单字节的,甚至是多字节的非首字节...


关于这个字符编码规则,可能有一些特定实现的库或者方法,不了解

论坛徽章:
0
7 [报告]
发表于 2009-01-03 10:39 |只看该作者
那我给一个示范吧, 用一个256bytes的 unsigned char 字符数组来记录相应的字长
在 0xc0 ~ 0x80 之间虽然也是单字节, 但这些不是独立字符, 而是多字节字符的非首位 ... 所以如果随便裁一个字符串出来
可以判断它的ASCII值来确保没有从半个之中间砍掉... 以前GBK/BIG5之类的编码就是没办法分清高位低位, 所以截取的时候
非得从头计算起...


  1. /* utf-8: 0xc0, 0xe0, 0xf0, 0xf8, 0xfc */
  2. unsigned char mblen_table_utf8[] =
  3. {
  4.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  5.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  7.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  8.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  9.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  10.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  11.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  12.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  13.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  14.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  15.         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  16.         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  17.         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  18.         3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  19.         4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1
  20. };

  21. #define MBLEN(x)  mblen_table_utf8[(x)]

  22. ...
  23. char *ptr, str[] = "hello,中文字";

  24. for (ptr = str, *ptr != '\0')
  25. {
  26.   printf("str[%d] is a word character with %d bytes\n", i, MBLEN(*ptr));
  27.   ptr += MBLEN(*ptr);
  28. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2009-01-03 10:55 |只看该作者
原帖由 hightman 于 2009-1-3 10:39 发表
那我给一个示范吧, 用一个256bytes的 unsigned char 字符数组来记录相应的字长
在 0xc0 ~ 0x80 之间虽然也是单字节, 但这些不是独立字符, 而是多字节字符的非首位 ... 所以如果随便裁一个字符串出来
可以判断 ...

非常感谢,这些正是我需要的,能不能再稍微详细介绍一下?(不好意思我只是个初学者)

论坛徽章:
0
9 [报告]
发表于 2009-01-03 10:56 |只看该作者
如果能给一些相关资料的连接也可以,谢谢~

论坛徽章:
0
10 [报告]
发表于 2009-01-03 11:01 |只看该作者
原帖由 hightman 于 2009-1-3 10:39 发表
那我给一个示范吧, 用一个256bytes的 unsigned char 字符数组来记录相应的字长
在 0xc0 ~ 0x80 之间虽然也是单字节, 但这些不是独立字符, 而是多字节字符的非首位 ... 所以如果随便裁一个字符串出来
可以判断 ...

问一下,您的方法跟这个帖子里面的方法是一样的吗?http://bbs.chinaunix.net/viewthread.php?tid=1230313
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP