免费注册 查看新帖 |

Chinaunix

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

关于多字节检测问题,在线等待中。。help [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-07 16:11 |只看该作者 |倒序浏览
windows 下有 _ismbblead 这样的函数 用来检测某个字节是否是多字节字符的前导字节,那么在linux有没有这类的函数
或者有没有办法可以实现这个函数,谢谢

论坛徽章:
0
2 [报告]
发表于 2010-07-07 16:19 |只看该作者
你自己判断一下不就好了,至于么?

论坛徽章:
0
3 [报告]
发表于 2010-07-07 16:21 |只看该作者
本帖最后由 dogonmoon 于 2010-07-07 16:22 编辑

呵呵,楼上说的倒是轻巧,有能力的话就给个思路,没意义的回复你就别发了

论坛徽章:
0
4 [报告]
发表于 2010-07-07 16:46 |只看该作者
某个字节是否是多字节字符的前导字节 是啥子意思呢?没搞明白呢

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2010-07-07 21:01 |只看该作者
有啊
int _ismbblead( unsigned int c );
<mbctype.h> or <mbstring.h>

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2010-07-07 21:04 |只看该作者
我日,我看错了,原来要求linux下的。我真傻!

论坛徽章:
0
7 [报告]
发表于 2010-07-08 21:20 |只看该作者
很容易啊,看了下微软的wdk带的mbctype.h文件

  1. _CRTIMP extern unsigned char _mbctype[];

  2. #define _M1     0x04    /* MBCS 1st (lead) byte */

  3. #define _ismbblead(_c)  ((_mbctype+1)[(unsigned char)(_c)] & _M1)
复制代码
这个_mbctype 数组的值与本地语言有关,相信你想要的是中文吧。
你只要写个简单的windows下的C程序,把 _mbctype 的值dump出来,再配上上面那两个宏_M1和 _ismbblead,就可以以用了。
dumpmb.c (在中文版本的windows下运行可以dump出中文版的_mbctype)

  1. Z:\>type dumpmb.c
  2. #include <stdio.h>
  3. #include <mbctype.h>
  4. int main()
  5. {
  6.         int i;
  7.         printf( "unsigned char _mbctype = {\n" );
  8.         for( i=0; i<257; ++i )
  9.         {
  10.                 printf( "0x%02X, ", _mbctype[i] );
  11.                 if( i%8==0 )
  12.                         printf( "\n" );
  13.         }
  14.         printf( " };\n " );
  15.         return 0;
  16. }

  17. Z:\>cl dumpmb.c
  18. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
  19. Copyright (C) Microsoft Corporation.  All rights reserved.

  20. dumpmb.c
  21. Microsoft (R) Incremental Linker Version 10.00.30319.01
  22. Copyright (C) Microsoft Corporation.  All rights reserved.

  23. /out:dumpmb.exe
  24. dumpmb.obj

  25. Z:\>dumpmb
  26. unsigned char _mbctype = {
  27. 0x00,
  28. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  29. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  30. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  31. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  32. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  33. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  34. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  35. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  36. 0x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
  37. 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
  38. 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
  39. 0x18, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, 0x08,
  40. 0x08, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
  41. 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
  42. 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
  43. 0x28, 0x28, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08,
  44. 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  45. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  46. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  47. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  48. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  49. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  50. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  51. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  52. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  53. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  54. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  55. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  56. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  57. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  58. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  59. 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
  60. };

  61. Z:\>
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-07-09 11:23 |只看该作者
谢谢 没本 兄, thx

论坛徽章:
0
9 [报告]
发表于 2010-07-09 11:35 |只看该作者
没本你真有闲心,现在winner了就有时间了?

论坛徽章:
0
10 [报告]
发表于 2010-07-09 11:52 |只看该作者
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){
  char c[4]={0};
  int nread = read(STDIN_FILENO, c, 4);
  priintf("%x-%x-%x-%x\n", c[0], c[1], c[2], c[3]);
  
  return 0;
}

编译运行, 传个上下左右光标键、普通字符之类的 试一下呗。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP