【问题标题】:unicode and python issue (access to unicde code charts)unicode 和 python 问题(访问 unicode 代码图表)
【发布时间】:2013-09-13 11:02:29
【问题描述】:

昨天我写了以下functioninteger 转换为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 ۳۴۵۵۳۴۵۵ 相当于PersianArabic language 中的3455。当你阅读 一个数字,例如从databae 读取,并希望在widget 中显示,这个 function 很有用。

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

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

注意:我发现可以使用int() built-in fuinction,但我不能使用它。也许你可以

【问题讨论】:

  • 你用的是python2还是python3?
  • 请注意,Python 附带了来自unicodedata 模块中内置 Unicode 图表的所有信息(并且保证它们与您的 Python 版本使用的 Unicode 版本相匹配)。跨度>
  • 作为旁注,listedEnglish.index(i) 本来就是int(i),对吧?这要简单得多,这意味着您可以完全摆脱 listedEnglish...

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


【解决方案1】:

您需要酌情阅读 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 对象,您应该尽早将其 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]

但是,其中任何一个都会将 any 脚本中的数字转换为数字,而不仅仅是波斯语。 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)

【讨论】:

  • 如果你读到 agian,我的 integerToPersian 工作正常,我需要帮助 persianToInteger
  • @MohsenPahlevanzadeh:如果你真的会回答人们的问题而不是一遍又一遍地写同样的评论,那么帮助你会容易得多。
猜你喜欢
  • 2017-07-24
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多