免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2006-03-07 15:05 |只看该作者
list_py=u'ab' #这是一个unicode字符串
eachline=unicode(eachline, 'gbk') #这是将eachline转为unicode

论坛徽章:
0
22 [报告]
发表于 2006-03-07 16:16 |只看该作者
原帖由 limodou 于 2006-3-7 15:05 发表
list_py=u'ab' #这是一个unicode字符串
eachline=unicode(eachline, 'gbk') #这是将eachline转为unicode

按您的方法报错:
  1.     eachline = unicode(eachline,'gbk')
  2. UnicodeDecodeError: 'gbk' codec can't decode bytes in position 316-317: illegal multibyte sequence
复制代码


另外您的那个方法:
while eachline in pinyin +'':  
其中的pinyin是list还是string啊?对于一个字符串可以get_next_char()吗,是得到的下一个字节还是下一个字符?

论坛徽章:
0
23 [报告]
发表于 2006-03-07 16:49 |只看该作者
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 316-317: illegal multibyte sequence


这可能是你没有设置程序的编码,如在最开始加上:


  1. #coding=gbk
复制代码


  1. pinyin +''
复制代码


当然是一个字符串了。因此这个方法需要使用unicode。而get_next_char()不是指的pinyin这个串,是指你要处理的字典翻译文本。

论坛徽章:
0
24 [报告]
发表于 2006-03-08 14:48 |只看该作者
还是不行,不知道怎么能让汉语拼音能像普通字母那样处理,
如:str1='a b'
str1[i] = ''a',那就简单多了。郁闷一个星期了。

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

论坛徽章:
0
26 [报告]
发表于 2006-03-08 16:08 |只看该作者
原帖由 limodou 于 2006-3-8 14:59 发表
不是已经说了嘛,使用unicode呀。因为unicode的一个字符就表示一个完整的汉字。而gbk汉字的话两个字符是一个汉字。如果使用gbk来处理的话,那么你要两个字符两个字符来处理,这样才是完整的。 

估计您也烦躁了,我自以为不是太笨,找了一些python中unicode的资料,还是不得要领。简单直接点问您吧,我有一行文本:
【牴牾】 dǐwǔ 抵牾 contradiction; conflict
保存在test.txt中,请问您要如何读取,然后如何操作(能把汉字和拼音像abcd一样处理),最好您就直接写段代码,将test.txt中的文本变成:
【牴牾】 <p>dǐwǔ</p> 抵牾 contradiction; conflict
我菜不是问题,问题是菜了还不承认。您也不要再教导了,如果我看不懂代码再来请教,谢谢!

论坛徽章:
0
27 [报告]
发表于 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
28 [报告]
发表于 2006-03-08 17:45 |只看该作者
limodou大侠真是热心,好感动!您的代码已经超出我的要求,呵呵,谢谢先!
您的代码肯定是没问题的,但我按您的提示,修改a:

  1. text=file('outputfile.txt').read()
  2. a= unicode(text,'gbk')
复制代码

结果报错:

  1. Traceback (most recent call last):
  2.   File "C:/Python24/limodou.py", line 5, in -toplevel-
  3.     a= unicode(text,'gbk')
  4. UnicodeDecodeError: 'gbk' codec can't decode bytes in position 266-267: illegal multibyte sequence
复制代码

这也是我一直郁闷的,我原来一直用的是直接定义字符串,调试unicode没问题,但是一旦读文件,再转unicode就报错,是不是我的编译环境问题啊?

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

论坛徽章:
0
30 [报告]
发表于 2006-03-08 18:45 |只看该作者

回复 29楼 limodou 的帖子

好的,我再试试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP