python - unicode和python问题(获取unicode码表)

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

昨天我写了下面的函数来将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),它返回 34553455 等同于 波斯语阿拉伯语 中的 3455。当你阅读 一个数字,例如从databae中读取,并想在widget中显示,这 function 非常有用。

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

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

注意:我发现可以使用 int() 内置函数,但我不能使用它。也许你可以

最佳答案

您需要阅读 Python 的 Python Unicode HOWTO 2.x3.x , 作为适当的。但我可以简要回答您的问题。

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

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 输出,请尽可能晚地编码

(极少数情况下,解码和编码的性能成本太高,你需要直接处理 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'),就这样。

how can use unicode code charts?

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

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

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

关于python - unicode和python问题(获取unicode码表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707008/

相关文章:

c# - System.Net.Mail 和 =?utf-8?B?XXXXX.... 标题

ios - 将字节读入 Swift 字符串

python - 如何在 Python 中更改 TestCase 类的文档字符串?

python - 函数给出一个列表。我想在另一个函数中乘以该列表

python - 在 Python 中处理古怪的编码

c++ - 从 NFD 到 NFC 的 OSX 和 C++ unicode 转换

java - itext 马拉地语(印度)语言显示问题

python - 如何在 Python Tornado 中打印所有传入数据?

python - 如何将 OS X Python 模块(站点包)移动到服务器位置?

swift - 什么是 String.Encoding.unicode?