IPA到arpabetpython

IPA到arpabetpython,python,unicode,phonetics,Python,Unicode,Phonetics,我想做一个简单的替换,如: line= line.replace ('ʃ',' sh ') line= line.replace ('ɐ͂',' an ') line= line.replace ('ẽ',' en ') 问题是python不接受这些字符 我也试过这样的方法: line= line.replace (u'\u0283',' sh ') 但我仍然无法打开任何内容,因为我遇到了解码错误: UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(1

我想做一个简单的替换,如:

line= line.replace ('ʃ',' sh ')
line= line.replace ('ɐ͂',' an ')
line= line.replace ('ẽ',' en ')
问题是python不接受这些字符

我也试过这样的方法:

line= line.replace (u'\u0283',' sh ')
但我仍然无法打开任何内容,因为我遇到了解码错误: UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0xcb


我搞砸了编解码器,但找不到任何合适的,也许我走错了路?

您可以在Python中使用非ASCII字符,但您必须用
\coding
语句告诉Python源文件的编码。确保将源保存在声明的编码中。使用Unicode进行所有文本处理也是一种很好的做法:

#!python2
#coding:utf8
line = u'This is a ʃɐ͂ẽ test'
line = line.replace (u'ʃ',u' sh ')
line = line.replace (u'ɐ͂',u' an ')
line = line.replace (u'ẽ',u' en ')
print line
输出:

This is a  sh  an  en  test
请注意,ɐ͂实际上是两个Unicode码点
ɐ
(U+0250)和一个结合希腊语PERISPOMENI的U+0342组合码点。
可以表示为单个代码点U+1EBD拉丁文小写字母E加上波浪号,或者表示为两个代码点U+0065拉丁文小写字母E和U+0303加上波浪号。为确保使用单个组合码点或分解字符,可以使用
unicodedata
模块:

import unicodedata as ud
line = ud.normalize('NFC',line) # combined.
line = ud.normalize('NFD',line) # decomposed.
还有NFKD和NFKC。请参阅Unicode标准以了解最适合您的详细信息

如果正在读取文件,请使用
io.open
并指定文件的编码,以自动将输入转换为Unicode:

with io.open('data.txt','r',encoding='utf8') as f:
    with line as f:
        # do something with Unicode line.

这是可行的,但仍然保留了一些字符,例如组合字符,如ẽ. 我会对一个完整的解决方案感兴趣,但这几乎就要实现了。非常感谢@巴德纳,如果你有其他要求,应该将它们编辑到你的问题中。这符合问题中所述的要求。听起来您可能需要首先规范化Unicode字符串。提供明确的例子。这很公平。你确实回答了这个问题。那么让我来编辑它。@badner,我编辑了答案,以表明您的新示例可以替换,但它们在字符是否可以用一个或两个代码点表示方面存在一些差异。用确切的错误消息为您提供明确的失败示例将有所帮助。