免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10289 | 回复: 20

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

论坛徽章:
0
发表于 2010-06-02 00:03 |显示全部楼层
在应用系统中,经常会用格式文本(每条记录一行、同一行记录各字段间用分隔符分开)进行数据传输或处理。这是一种很通用也很方便的做法。
但是在某些情况下,这种方法也会存在问题。
通常,我们使用的分隔符都是单个ASCII字符(常用的有'|'、';'、','等),如果数据文件中的数据也都是单字节字符,那不会存在问题。但当数据中含有多字节字符,例如汉字时,问题就出来了!很有可能某个汉字的一半刚好就是分隔符。这种情况可能并不是每天都能遇到,但是偶尔遇到一次就够你受了!很可能数据往数据库里加载的时候报数据非法、或者直接就core了。

大家在平时是如何处理这个问题的?

论坛徽章:
0
发表于 2010-06-02 06:47 |显示全部楼层
本帖最后由 xiexiecn 于 2010-06-02 06:50 编辑

这个稍微注意一下汉字编码就能解决了吧。比如:

GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。
如果用这个编码,就不存在你说的问题。

GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。

如果是这个编码,分析文件的时候每次读出一个字节都判断一下,是不是大于128,如果是的话,就把这个字节当作汉字的第一个字节,直接读出下一个字节,不当作分隔符。

论坛徽章:
0
发表于 2010-06-02 10:02 |显示全部楼层
用\n作为分隔符不是很好吗!

论坛徽章:
0
发表于 2010-06-02 10:24 |显示全部楼层
回复 2# xiexiecn


    问题就在这里,最常用的分隔符('|'、'^')都是在0x40 至0x7E这个范围内。每次找到分隔符后还要去判断前一个字节的值太罗嗦了。

论坛徽章:
0
发表于 2010-06-02 10:26 |显示全部楼层
用\n作为分隔符不是很好吗!
liexusong 发表于 2010-06-02 10:02



    \n只能作为记录分隔符,每条记录占用一行。但是一条记录是由多个字段组成的,各字段间还有分隔符

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


        我的理解和你不一样,不是读到分隔符的时候去判断前一个字节,而是每次读出一个字节的时候就判断,如果是>128的,那么直接就读出下一个(这个字节不作分隔符判断),直接表示这是一个完整的汉字。如果是'|'或者'^',那肯定就是分隔符了,不必再去判断前面一个字节,因为已经判断过了。

论坛徽章:
0
发表于 2010-06-02 10:47 |显示全部楼层
回复 6# xiexiecn


    一般都是直接用strchr()来定位分隔符的。你说的也是一种解决思路

论坛徽章:
0
发表于 2010-06-02 10:56 |显示全部楼层
用xml,抛弃|。

把有|的汉字过滤一遍,也是个方法。


[倈] [億] [剕] [厊] [唡] [噟] [坾] [墊] [妡] [媩]
[寍] [峾] [巪] [弢] [恷] [憒] [抾] [搢] [攟] [晐]
[東] [梶] [榺] [檤] [殀] [渱] [潀] [瀨] [焲] [爘]
[獆] [珅] [瑋] [瓅] [畖] [瘄] [皘] [眧] [瞸] [硘]
[磡] [祙] [秥] [穦] [竱] [箌] [簗] [粅] [紎] [絴]
[緗] [縷] [纜] [羭] [聕] [脇] [膢] [舼] [苵] [莬]
[葇] [蓔] [蕓] [藎] [蘾] [蛗] [蝲] [蟶] [衸] [褆]
[襹] [觸] [詜] [諀] [謡] [讄] [貄] [質] [趞] [踻]
[軀] [輡] [迀] [遼] [鄚] [醸] [鈢] [銃] [鋦] [鍇]
[鎩] [鐋] [鑭] [閨] [陓] [雦] [靯] [韡] [顋] [飢]
[饇] [駖] [騶] [髚] [魘] [鮸] [鰘] [鱸] [鴟] [鵿]
[鷟] [鹼] [鼃] [齶]

论坛徽章:
0
发表于 2010-06-02 10:59 |显示全部楼层
用xml文件体积太大、处理速度慢。
数据文件里有些是地名、企业名称,什么字都可能出现。

论坛徽章:
0
发表于 2010-06-02 11:03 |显示全部楼层
我们让客户 王珅 改名 王王申
做他的再生父母
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




----------------------------------------

点击报名>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP