免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tikico
打印 上一主题 下一主题

大侠请进:如何在英文和中文之间加入分隔符 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-08 14:59 |显示全部楼层
不是已经说了嘛,使用unicode呀。因为unicode的一个字符就表示一个完整的汉字。而gbk汉字的话两个字符是一个汉字。如果使用gbk来处理的话,那么你要两个字符两个字符来处理,这样才是完整的。 

论坛徽章:
0
12 [报告]
发表于 2006-03-08 17:19 |显示全部楼层

  1. #coding=gbk

  2. a = u'【牴牾】 dǐwǔ 抵牾 contradiction; conflict 【牴牾】 dǐwǔ 抵牾 contradiction; conflict'

  3. FLAG_WORD = 1
  4. FLAG_PINYIN = 2
  5. FLAG_ZH = 3
  6. FLAG_EN = 4
  7. tags = {
  8.     FLAG_WORD:('<w>', '</w>'),
  9.     FLAG_PINYIN:('<p>', '</p>'),
  10.     FLAG_ZH:('<zh>', '</zh>'),
  11.     FLAG_EN:('<en>', '</en>')
  12. }

  13. flag = -1
  14. i = 0
  15. s = [] #结果
  16. buf = [] #缓冲区
  17. pinyin = u'dǐwǔ' + ' '
  18. last_begin_tag = ''
  19. last_flag = flag
  20. while i<len(a):
  21.     if a[i] == u'【': #开始处理单词
  22.         #判断buf是否有内容,有则输出,同时注意结束tag
  23.         if buf:
  24.             b, e = tags[last_flag]
  25.             buf.append(e)
  26.             s.append(''.join(buf))
  27.             buf = []
  28.         flag = FLAG_WORD
  29.         buf.append(a[i])
  30.         i += 1
  31.         while i < len(a) and a[i] != u'】':
  32.             buf.append(a[i])
  33.             i += 1
  34.         #将】也加到缓冲区中
  35.         buf.append(a[i])
  36.         i += 1
  37.         b, e = tags[flag]
  38.         s.append(b + ''.join(buf) + e)
  39.         
  40.         #开始处理拼音
  41.         flag = FLAG_PINYIN
  42.         buf = []
  43.         while i<a[i] and a[i] in pinyin:
  44.             buf.append(a[i])
  45.             i += 1
  46.         b, e = tags[flag]
  47.         s.append(b + ''.join(buf).strip() + e) #使用strip去掉多余的首尾空格
  48.         last_flag = flag
  49.         buf = []
  50.         continue
  51.     else:
  52.         if ord(a[i]) < 127: #英文
  53.             flag = FLAG_EN
  54.         else:
  55.             flag = FLAG_ZH
  56.         if last_flag != flag:
  57.             #判断是否上一个标志是否是中或英文,如果不是表示第一次进入则输出开始tag,
  58.             #否则先输出上一个的结束tag,然后是一个开始tag
  59.             if last_flag in (FLAG_ZH, FLAG_EN):
  60.                 b, e = tags[last_flag]
  61.                 buf.append(e)
  62.             b, e = tags[flag]
  63.             buf.append(b)
  64.             buf.append(a[i])
  65.             last_flag = flag
  66.         else:
  67.             buf.append(a[i])
  68.     i += 1

  69. if buf:
  70.     b, e = tags[last_flag]
  71.     buf.append(e)
  72.     s.append(''.join(buf))
  73.         
  74. print ''.join([x.encode('gbk') for x in s])
复制代码


这里我没有从文件中读出文本,直接使用了一个unicode串来处理的。而且可以处理多个汉语词组。因此最开始可以:

text = file('a.txt').read() #这样把文本全部读出来
然后转化为unicode

a = unicode(text, 'gbk')

论坛徽章:
0
13 [报告]
发表于 2006-03-08 17:47 |显示全部楼层
有可能是你的文件有无法识别的汉字。可以考虑把示例的文本写入一个文件,用它先试一下。如果没有问题,那就考虑文件中的汉字有非法的。那可以考虑使用utf-8来处理了。但代码中有一处要转为gbk编码的也要转为utf-8才行。

论坛徽章:
0
14 [报告]
发表于 2006-03-09 12:12 |显示全部楼层
存成文本的编码要与你转码的编码要一致。比如使用utf-8转码,那文本就需要是utf-8的。如果是gbk转码,那文本就需要是gbk的。不是简单地存一下就行的。

论坛徽章:
0
15 [报告]
发表于 2006-03-09 16:09 |显示全部楼层
希望你的python能更上一层楼。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP