unicode和python问题(访问unicode代码图)

2024-04-28 08:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

昨天,我写了以下functioninteger转换为{}:

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 ۳۴۵۵۳۴۵۵相当于PersianArabic language中的3455 一个数字,例如从databae读取,并希望在widget中显示,则 function非常有用。在

我从http://unicode.org下载了unicodecodes charts,因为我需要编写PersianToInteger('unicodeString'),根据它应该得到utf-8作为参数,utf-8存储{},我也是pytho的新手。在

我的问题是,如何存储2bytes?,如何存储utf8,如何将unicode string拆分为另一种格式?如何使用unicode code charts?在

注意:我发现我使用了int() built-in fuinction,但我不能使用可能吧你可以吗


Tags: innumberreturndefunicodefunctionintegerlist
1条回答
网友
1楼 · 发布于 2024-04-28 08:14:06

您需要阅读Python 2.x3.x的Python Unicode HOWTO。但我可以给你简短的回答。在

My questions are, how can store 2bytes? how can utf8 store , how can split an unicode string to another format ?

unicode对象包含字符,bytes对象包含字节。在

这和Python中的一样。在这两种语言中,既没有u也没有b前缀的文字就是str。因为您没有告诉我们您使用的是python2还是python3,所以我将在任何地方使用显式的unicode和{},以及{}和{}前缀。在

通过选择一个编码(在本例中是UTF-8)并使用encode和{}方法在它们之间进行转换。例如:

>>> 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对象,您应该尽早将其decode转换成{},并用Unicode完成所有工作。然后你就不必担心什么东西需要多少字节,只要把每个字符都当作一个字符就行了。如果需要UTF-8输出,encode尽可能晚地返回。在

(有时,解码和编码的性能成本太高,需要直接处理UTF-8。但除非这确实是代码中的瓶颈,否则不要这样做。)

因此,假设您希望调整integerToPersian以获取UTF-8英文数字字符串而不是整数,并返回UTF-8波斯语数字字符串而不是Unicode数字字符串。(在本例中,我假设使用Python3)您只需将str(number)更改为number.decode('utf-8'),并将{}更改为{},就这样。在

how can use unicode code charts?

Python已经提供了编译到^{}模块中的Unicode代码图(以及与您的Python版本相匹配的正确代码图),因此通常只使用这些代码图要比自己尝试使用这些代码图容易得多。例如:

^{pr2}$

… i need to wrote 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)

相关问题 更多 >