您需要酌情阅读 Python 2.x或3.x的 Python Unicode HOWTO 。但我可以简要回答你的问题。
我的问题是,如何存储 2 个字节?utf8 如何存储,如何将 unicode 字符串拆分为另一种格式?
一个unicode
对象包含字符;一个bytes
对象保存字节。
请注意,在 Python 2.x 中,与 ;str
相同bytes
。在 3.x 中,它与unicode
. u
在这两种语言中,既没有 a也没有b
前缀的文字是 a str
。由于您没有告诉我们您使用的是 Python 2 还是 Python 3,所以我将在任何地方使用显式的unicode
andbytes
和u
andb
前缀。
您可以通过选择一种编码(在本例中为 UTF-8)并使用encode
anddecode
方法在它们之间进行转换。例如:
>>> 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-8bytes
对象,你应该decode
尽可能unicode
早地使用它,并用 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)