Unicode和Python的问题(访问unicde码图)(unicode and python i

2019-10-18 14:48发布

昨天我写了下面的function转换integerPersian

def integerToPersian(number):
    listedPersian = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹']
    listedEnglish = ['0','1','2','3','4','5','6','7','8','9']    
    returnList = list()

    listedTmpString = list(str(number))

    for i in listedTmpString:
        returnList.append(listedPersian[listedEnglish.index(i)])

    return ''.join(returnList)

当你调用它,如: integerToPersian(3455)return ۳۴۵۵۳۴۵۵相当于3455PersianArabic language 。当你看一个数字,如从阅读databae ,并希望在显示widget ,这个function是非常有用的。

我下载codes chartsunicode从http://unicode.org ,因为我需要写PersianToInteger('unicodeString')根据其应该得到utf-8作为参数和utf-82 bytes ,而且我在新手pytho。

我的问题是,如何可以存储2bytes ? ,怎么能utf8店,怎么可以拆分的unicode string为另一种格式? 如何使用unicode code charts

注:我发现使用int() built-in fuinction ,但我无法使用it.may是你能

Answer 1:

你需要阅读Python的Unicode HOWTO对于任何的Python 2.x的或3.X适当。 但我可以给你简单问题的答案。

我的问题是,如何可以存储2个字节? 如何UTF8店,怎么可以拆分的unicode字符串为另一种格式?

unicode对象持有字符; 一个bytes对象保存字节。

需要注意的是在Python 2.x中, str是一回事bytes ; 在3.x中,这是同样的事情unicode 。 而在这两种语言,既没有文字u也不是b前缀是一个str 。 既然你无论你是使用Python 2或3并没有告诉我们,我会用明确unicodebytes ,以及ub前缀,无处不在。

您可以通过选择编码(在这种情况下,UTF-8),并使用它们之间的转换encodedecode方法。 例如:

>>> my_str = u'۰۱'
>>> my_bytes = b'\xdb\xb0\xdb\xb1'
>>> my_str.encode('utf-8') == my_bytes
True
>>> my_bytes.decode('utf-8') == my_str
True

如果你有一个UTF-8 bytes对象,你应该decodeunicode尽早,并用它做的一切工作中的Unicode。 然后,你不必担心有多少字节的东西是如何发生,只是把每一个字符一个字符。 如果您需要UTF-8输出, encode背越晚越好。

(很偶然,解码和编码的性能成本太高了,你需要处理UTF-8,直接。但是,除非真的是在你的代码中的瓶颈,不这样做。)

所以,让我们说你要调整你的integerToPersian采取UTF-8英文数字串代替整数,并改为返回某个Unicode的UTF-8波斯数字串。 (我假设的Python 3这个例子的目的)。所有你需要做的是改变str(number)number.decode('utf-8')return ''.join(returnList)return ''.join(returnList).encode('utf-8')并且仅此而已。

如何使用unicode编码表?

蟒蛇已经自带了Unicode码图(和是正确的,以配合您的Python版本)编译成unicodedata模块,所以通常这是一个更容易只使用那些不是试图自己使用的图表。 例如:

>>> import unicodedata
>>> unicodedata.digit(u'۱')
1

...我需要写PersianToInteger( '的UnicodeString')

你真的不应该需要。 除非您使用的是非常老的Python, int应该为你做。 例如,在2.6:

>>> int(u'۱۱')
11

如果它不为你工作, unicodedata是最简单的解决方案:

>>> numeral = u'۱۱'
>>> [unicodedata.digit(ch) for ch in numeral]
[1, 1]

然而,任何一项都将在任何脚本转换位数的数字,而不仅仅是波斯。 并没有什么以Unicode图表,会直接告诉你一个数字是波斯; 你能做的最好的是解析名称:

>>> all('ARABIC-INDIC DIGIT' in unicodedata.name(ch) for ch in numeral)
True
>>> all('ARABIC-INDIC DIGIT' in unicodedata.name(ch) for ch in '123')
False

如果你真的想从一个脚本到另一个做通过映射位在任一方向的事情,这里有一个更好的解决方案:

listedPersian = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹']
listedEnglish = ['0','1','2','3','4','5','6','7','8','9']    
persianToEnglishMap = dict(zip(listedPersian, listedEnglish))
englishToPersianMap = dict(zip(listedEnglish, listedPersian))

def persianToNumber(persian_numeral):
    english_numeral = ''.join(persianToEnglishMap[digit] for digit in persial_numeral)
    return int(english_numeral)


文章来源: unicode and python issue (access to unicde code charts)