免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sunlan

[C] 【讨论】格式文本中的分隔符 [复制链接]

论坛徽章:
0
发表于 2010-06-02 11:15 |显示全部楼层
认识这个字不?“丿”,我在江苏那边遇到一个地名里有这个字

论坛徽章:
0
发表于 2010-06-02 11:17 |显示全部楼层
名称                             第一字节                             第二字节

GB2312           0xB0-0xF7(176-247)          0xA0-0xFE(160-254)

GBK                 0x81-0xFE(129-254)        0x40-0xFE(64-254)

Big5                0x81-0xFE(129-255)        0x40-0x7E(64-126)

                                                                  0xA1-0xFE(161-254)


所以我觉得用64以下的字符作为分隔符应该就可以了, 好像用\t做分隔符!

论坛徽章:
0
发表于 2010-06-02 11:34 |显示全部楼层
丿 不就是笔画么。
  第 56 区  〖 一、丨、丿、刂、亻 〗
┏━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ D8 ┃   0   1   2   3   4   5   6   7   8   9  ┃
┣━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 560┃        亍   丌   兀   丐   廿   卅   丕   亘   丞  ┃
┃ 561┃   鬲   孬   噩   丨   禺   丿   匕   乇   夭   爻  ┃
┃ 562┃   卮   氐   囟   胤   馗   毓   睾   鼗   丶   亟  ┃
┃ 563┃   鼐   乜   乩   亓   芈   孛   啬   嘏   仄   厍  ┃
┃ 564┃   厝   厣   厥   厮   靥   赝   匚   叵   匦   匮  ┃
┃ 565┃   匾   赜   卦   卣   刂   刈   刎   刭   刳   刿  ┃
┃ 566┃   剀   剌   剞   剡   剜   蒯   剽   劂   劁   劐  ┃
┃ 567┃   劓   冂   罔   亻   仃   仉   仂   仨   仡   仫  ┃
┃ 568┃   仞   伛   仳   伢   佤   仵   伥   伧   伉   伫  ┃
┃ 569┃   佞   佧   攸   佚   佝                           ┃
┗━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛

论坛徽章:
0
发表于 2010-06-02 16:49 |显示全部楼层
这个字不光是笔画,盐城有个地名叫“曹丿”

论坛徽章:
0
发表于 2010-06-02 18:13 |显示全部楼层
回复 14# sunlan


    这个字怎么读?

论坛徽章:
0
发表于 2010-06-02 20:56 |显示全部楼层
回复 15# 蜡笔小新他爸


    就念作pie

论坛徽章:
0
发表于 2010-06-02 21:59 |显示全部楼层
可以试试将各个字段间用多个@@@分割或约定新的格式{begin...end}来解决

论坛徽章:
0
发表于 2010-06-02 22:05 |显示全部楼层
可以试试用多个#或约定新的格式如{begin...end}来解决

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2010-06-21 17:36 |显示全部楼层
本帖最后由 yulihua49 于 2010-06-21 17:50 编辑
在应用系统中,经常会用格式文本(每条记录一行、同一行记录各字段间用分隔符分开)进行数据传输或处理。这 ...
sunlan 发表于 2010-06-02 00:03



    可以转义,这问题早已解决。
XML和JSON也是用转义。

对于汉字,识别和跳过。
比如,我们用stptok()来拆分串,一个改造的stptok,跳过汉字,支持GBK,但不支持18030:

  1. /*function:iscc 判断是否是汉字*/
  2. int iscc(unsigned char ch)
  3. {
  4.         return (ch >= 0x81 && ch < 0xff);
  5. }
  6. /*function:cc1 取汉字的一个字节*/
  7. static int cc1(unsigned char *bp,unsigned char *bufp)
  8. {
  9.         register unsigned char *p;
  10.         register int i = 0;
  11.         for(p = bufp; iscc(*p); p--)
  12.         {
  13.                 i++;
  14.                 if(p <= bp)
  15.                         break;
  16.         }
  17.         return (i & 1);
  18. }
  19. /*function:firstcc 汉字的第一个字节*/
  20. int firstcc(unsigned char *bp,unsigned char *bufp)
  21. {
  22.         if(!bufp || !(*bufp) || (bufp < bp) || !iscc(*bufp))
  23.                 return 0;
  24.         return (cc1(bp, bufp));
  25. }
  26. /*function:secondcc 汉字的第二个字节*/
  27. int secondcc(unsigned char *bp,unsigned char *bufp)
  28. {
  29.         if(!firstcc(bp, bufp-1))
  30.                 return 0;
  31.         if(*bufp == 0x7f)
  32.                 return 0;
  33.         if((*bufp >= 0x40) && (*bufp <= 0xfe))
  34.                 return 1;
  35.         return 0;
  36. }

  37. /************************************************************************/
  38. /*function:stptok 分解字符串为一组标记串                                        */
  39. /*description:根据分隔符'tok',从'src'分解到'trg'中,如果'tok'不设置,则*/
  40. /*根据'src'与len的最小值,将'src'拷贝到'trg'中。可以解决汉字中出现的与  */
  41. /*'tok'相同的分隔符被分解。                                    */
  42. /************************************************************************/
  43. char *stptok(char *src,char *trg,int len,char *tok)
  44. {
  45.         register unsigned char *p;
  46.         if(trg) *trg = 0;
  47.         p = (unsigned char *)src;
  48.         if(!p || !(*p)) return src ;
  49.         if(tok && *tok) {
  50.                 while(*p) {
  51.                         if(strchr(tok, *p)) {
  52. //跳过汉字之后的字符
  53.                                 if((p > (unsigned char *)src) && firstcc((unsigned char *)src, p-1)) {
  54.                                         p++;
  55.                                         continue;
  56.                                 }
  57.                                 break;
  58.                         }
  59.                         p++;
  60.                 }
  61.         } else {
  62.                 int l=strlen(src);
  63.                 if((len > 0) && (len < l))
  64.                         p = src + len;
  65.                 else p = src + l;
  66.         }
  67.         if(!trg || (len <= 1))
  68.                 return p;

  69.         while(*src && --len) {
  70.                 if((unsigned char *)src == p)
  71.                         break;
  72.                 *trg++ = *src++;
  73.         }
  74.         *trg = 0;

  75.         return src;
  76. }
复制代码
SDBC的基础函数,用了很多年的,可靠。

打包时直接打,不管汉字不汉字,拆包时用stptok,保证汉字完整性。

论坛徽章:
0
发表于 2010-06-22 15:20 |显示全部楼层
perl split函数来处理

c + perl
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP