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

时间:2013-09-09 21:04:21

标签: python unicode utf-8 unicode-string python-unicode

昨天我写了以下function来将integer转换为Persian

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

我从http://unicode.org下载了codes charts unicode,因为我需要写PersianToInteger('unicodeString')根据它应该utf-8作为参数和{{1} } store utf-8,我也是pytho的新手。

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

注意:我发现使用unicode code charts,但我无法使用它。可能你可以

1 个答案:

答案 0 :(得分:4)

您需要根据需要阅读Python 2.x3.x的Python Unicode HOWTO。但我可以简要回答你的问题。

  

我的问题是,如何存储2bytes? utf8如何存储,如何将unicode字符串拆分为另一种格式?

unicode对象包含字符; bytes对象包含字节。

请注意,在Python 2.x中,strbytes相同;在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英文数字字符串而不是整数,并返回UTF-8波斯数字字符串而不是Unicode数字字符串。 (我假设Python 3用于此示例。)您需要做的就是将str(number)更改为number.decode('utf-8'),并将return ''.join(returnList)更改为return ''.join(returnList).encode('utf-8'),这就是它

  

如何使用unicode代码图表?

Python已经附带编译到unicodedata模块中的Unicode代码图表(以及与您的Python版本匹配的正确代码图表),因此通常使用这些代码比尝试使用图表要容易得多你自己。例如:

>>> 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)