大侠请进:如何在英文和中文之间加入分隔符

list_py=u'ab' #这是一个unicode字符串
eachline=unicode(eachline, 'gbk') #这是将eachline转为unicode


QUOTE:
原帖由 limodou 于 2006-3-7 15:05 发表
list_py=u'ab' #这是一个unicode字符串
eachline=unicode(eachline, 'gbk') #这是将eachline转为unicode

按您的方法报错:

[Copy to clipboard] [ - ]
CODE:
    eachline = unicode(eachline,'gbk')
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 316-317: illegal multibyte sequence

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


QUOTE:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 316-317: illegal multibyte sequence

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

[Copy to clipboard] [ - ]
CODE:
#coding=gbk



[Copy to clipboard] [ - ]
CODE:
pinyin +''

当然是一个字符串了。因此这个方法需要使用unicode。而get_next_char()不是指的pinyin这个串,是指你要处理的字典翻译文本。
还是不行,不知道怎么能让汉语拼音能像普通字母那样处理,
如:str1='a b'
str1[i] = ''a',那就简单多了。郁闷一个星期了。
不是已经说了嘛,使用unicode呀。因为unicode的一个字符就表示一个完整的汉字。而gbk汉字的话两个字符是一个汉字。如果使用gbk来处理的话,那么你要两个字符两个字符来处理,这样才是完整的。 


QUOTE:
原帖由 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
我菜不是问题,问题是菜了还不承认。您也不要再教导了,如果我看不懂代码再来请教,谢谢!


[Copy to clipboard] [ - ]
CODE:
#coding=gbk

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

FLAG_WORD = 1
FLAG_PINYIN = 2
FLAG_ZH = 3
FLAG_EN = 4
tags = {
    FLAG_WORD:('<w>', '</w>'),
    FLAG_PINYIN:('<p>', '</p>'),
    FLAG_ZH:('<zh>', '</zh>'),
    FLAG_EN:('<en>', '</en>')
}

flag = -1
i = 0
s = [] #结果
buf = [] #缓冲区
pinyin = u'dǐwǔ' + ' '
last_begin_tag = ''
last_flag = flag
while i<len(a):
    if a[i] == u'【': #开始处理单词
        #判断buf是否有内容,有则输出,同时注意结束tag
        if buf:
            b, e = tags[last_flag]
            buf.append(e)
            s.append(''.join(buf))
            buf = []
        flag = FLAG_WORD
        buf.append(a[i])
        i += 1
        while i < len(a) and a[i] != u'】':
            buf.append(a[i])
            i += 1
        #将】也加到缓冲区中
        buf.append(a[i])
        i += 1
        b, e = tags[flag]
        s.append(b + ''.join(buf) + e)
        
        #开始处理拼音
        flag = FLAG_PINYIN
        buf = []
        while i<a[i] and a[i] in pinyin:
            buf.append(a[i])
            i += 1
        b, e = tags[flag]
        s.append(b + ''.join(buf).strip() + e) #使用strip去掉多余的首尾空格
        last_flag = flag
        buf = []
        continue
    else:
        if ord(a[i]) < 127: #英文
            flag = FLAG_EN
        else:
            flag = FLAG_ZH
        if last_flag != flag:
            #判断是否上一个标志是否是中或英文,如果不是表示第一次进入则输出开始tag,
            #否则先输出上一个的结束tag,然后是一个开始tag
            if last_flag in (FLAG_ZH, FLAG_EN):
                b, e = tags[last_flag]
                buf.append(e)
            b, e = tags[flag]
            buf.append(b)
            buf.append(a[i])
            last_flag = flag
        else:
            buf.append(a[i])
    i += 1

if buf:
    b, e = tags[last_flag]
    buf.append(e)
    s.append(''.join(buf))
        
print ''.join([x.encode('gbk') for x in s])

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

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

a = unicode(text, 'gbk')
limodou大侠真是热心,好感动!您的代码已经超出我的要求,呵呵,谢谢先!
您的代码肯定是没问题的,但我按您的提示,修改a:

[Copy to clipboard] [ - ]
CODE:
text=file('outputfile.txt').read()
a= unicode(text,'gbk')

结果报错:

[Copy to clipboard] [ - ]
CODE:
Traceback (most recent call last):
  File "C:/Python24/limodou.py", line 5, in -toplevel-
    a= unicode(text,'gbk')
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 266-267: illegal multibyte sequence

这也是我一直郁闷的,我原来一直用的是直接定义字符串,调试unicode没问题,但是一旦读文件,再转unicode就报错,是不是我的编译环境问题啊?
有可能是你的文件有无法识别的汉字。可以考虑把示例的文本写入一个文件,用它先试一下。如果没有问题,那就考虑文件中的汉字有非法的。那可以考虑使用utf-8来处理了。但代码中有一处要转为gbk编码的也要转为utf-8才行。
好的,我再试试!