参考链接: Unicodedata – Python中的Unicode数据库

@[TOC](这里写目录标题

使用Unicode排序算法排序Unicode数据库

Python比较任何类型的序列时,会一一比较序列里的各个元素。

对字符串来说,比较的是码位。

对于非ASCII字符比较时, 非ASCII文本的标准排序方式是使用locale.strxfrm函数。

使用locale.strxfrm函数之前,必须先为应用设定合适的区域设置

>>> import locale

>>> locale.setlocale(locale.LC_COLLATE, 'pt_BR.UTF-8')

'pt_BR.UTF-8'

>>> fruits = ['caju', 'atemoia', 'cajá', 'açaí', 'acerola']

>>> sorted_fruits = sorted(fruits, key=locale.strxfrm)

>>> sorted_fruits

['açaí', 'acerola', 'atemoia', 'cajá', 'caju']

其中有几点要注意

区域设置是全局的,因此不推荐在库中调用setlocale函数操作系统必须支持区域设置,否则setlocale函数会抛出locale.Error: unsupported locale setting异常。必须知道如何拼写区域名称。操作系统的制作者必须正确实现了所设的区域。

使用Unicode排序算法排序

James Tauber 开发了PyUCA库,这是Unicode排序算法(Unicode Collation Algorithm UCA)的纯Python实现。

#使用pyuca.Collator.sort_key方法

>>> import pyuca

>>> coll = pyuca.Collator()

>>> fruits = ['caju', 'atemoia', 'cajá', 'açaí', 'acerola']

>>> sorted_fruits = sorted(fruits, key=coll.sort_key)

>>> sorted_fruits

['açaí', 'acerola', 'atemoia', 'cajá', 'caju']

Unicode数据库

Unicode标准提供了一个完整的数据库(许多格式化的文本文件),不仅包括码位与字符名称之间的映射,还有各个字符的元数据,以及字符之间的关系。

unicodedata模块中有几个函数用于获取字符的元数据。

#Unicode数据库中数值字符的元数据示例(各个标号说明输出中的各列)

import unicodedata

import re

re_digit = re.compile(r'\d')

sample = '1\xbc\xb2\u0969\u136b\u216b\u2466\u2480\u3285'

for char in sample:

print('U+%04x' % ord(char),                        ➊

char.center(6),                              ➋

're_dig' if re_digit.match(char) else '-',   ➌

'isdig' if char.isdigit() else '-',          ➍

'isnum' if char.isnumeric() else '-',        ➎

format(unicodedata.numeric(char), '5.2f'),   ➏

unicodedata.name(char),                      ➐

sep='\t')

➊ U+0000格式的码位。 ➋ 在长度为6的字符串中居中显示字符。 ➌ 如果字符匹配正则表达式r’\d’,显示re_dig。 ➍ 如果char.isdigit()返回True,显示isdig。 ➎ 如果char.isnumeric()返回True,显示isnum。 ➏ 使用长度为5、小数点后保留2位的浮点数显示数值。 ➐ Unicode标准中字符的名称。

输出

U+0031      1       re_dig    isdig    isnum     1.00    DIGIT ONE

U+00bc      ¼       -    -    isnum     0.25    VULGAR FRACTION ONE QUARTER

U+00b2      ²       -    isdig    isnum     2.00    SUPERSCRIPT TWO

U+0969      ३       re_dig    isdig    isnum     3.00    DEVANAGARI DIGIT THREE

U+136b      ፫       -    isdig    isnum     3.00    ETHIOPIC DIGIT THREE

U+216b      Ⅻ       -    -    isnum    12.00    ROMAN NUMERAL TWELVE

U+2466      ⑦       -    isdig    isnum     7.00    CIRCLED DIGIT SEVEN

U+2480      ⒀       -    -    isnum    13.00    PARENTHESIZED NUMBER THIRTEEN

U+3285      ㊅       -    -    isnum     6.00    CIRCLED IDEOGRAPH SIX=

分析:第6列是在字符上调用unicodedata.numeric(char)函数得到的结果。这表明,Unicode知道表示数字的符号的数值。

[转载] Unicode文本排序和Unicode数据库相关推荐

  1. 一个用于读unicode文本的迭代器(iterator)

    written by chenghuige at gmail.com 也需有更好的方法我没有想到,但是没有在linux下面找到比较方便的读取unicode文本的方法. 用ICU,QT都太重量级了,于是 ...

  2. 开发小技巧之:unicode的排序和正则匹配

    文章目录 简介 ASCII字符的排序 本地字符的排序 为什么不使用unicode进行排序 emoji的正则匹配 总结 简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑 ...

  3. 《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化

    将 Unicode 文本标准化 问题 你正在处理 Unicode 字符串,需要确保所有字符串在底层有相同的表示. 解法 在 Unicode 中,某些字符能够用多个合法的编码表示.为了说明,考虑下面的这 ...

  4. 转载:文本编辑器 UltraEdit/EmEditor/EditPlus/AptEdit 之超级评测

    转载:文本编辑器 UltraEdit/EmEditor/EditPlus/AptEdit 之超级评测 2009-07-15 18:32:25 文/deepview 出处: www.provesoft. ...

  5. python 中文转unicode编码_Python 解码 Unicode 转义字符串

    其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...

  6. java是几位的unicode,下列说法错误的是()。A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种...

    下列说法错误的是().A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种 更多相关问题 [名词解释] 捐躯juān qū [名词解释] 藕断丝连ǒu ...

  7. 【Java实现基于关键词的文本排序检索系统】

    Java实现基于关键词的文本排序检索系统@TOC 注:个人的学习记录,勿用于其它途径 实验要求: (1)利用TF-IDF模型,为文本库中的文本创建索引(如倒排索引). (2)用户输入的关键词可以是一个 ...

  8. mapreduce文本排序_MapReduce:通过数据密集型文本处理

    mapreduce文本排序 自上次发布以来已经有一段时间了,因为我一直忙于Coursera提供的一些课程. 有一些非常有趣的产品,值得一看. 前一段时间,我购买了Jimmy Lin和Chris Dye ...

  9. linux 文本排序、合并和分割 -转

    sort [选项] [输入文件](文本排序) 选项: -c 测试文件是否已经被排序 -k 指定排序的域 -m 合并两个已排序的文件 -n 根据数字大小进行排序 -o[输出文件] 当输出写到指定的文件 ...

最新文章

  1. Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
  2. 【Java并发编程】并发容器之CopyOnWriteArrayList
  3. Spring boot默认日志配置
  4. 解决Unable to create group (name already exists)
  5. Vue.js——vue-resource全攻略
  6. 让linux服务器支持安全http协议(https)
  7. Oracle中的事务之savepoint
  8. 教你如何利用EXCEL制作动态仪表盘
  9. CVPR 9999 Best Paper——《一种加辣椒的番茄炒蛋》
  10. Django - - - -视图层之视图函数(views)
  11. linux硬盘打开ncq,linux下如何开启ncq
  12. 计算机无法发现网络共享打印机,win10发现不了共享打印机怎么办 共享打印机找不到的解决方法步骤...
  13. bigworld引擎
  14. python-pygame实现飞机大战-4-获取补给、发射强化子弹以及放大招清屏
  15. 51小项目——使用proteus搭建简易的光照度计-(1)
  16. 调整HTML5画布中图像的大小
  17. nginx启动流程之work初始化
  18. 单亲家庭父子的理财通信
  19. 部门来了个测试工程师,一副小毛孩样,本以为很菜,谁想到...
  20. mysql根据字母和数字进行排序

热门文章

  1. android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
  2. android客户端中间人攻击,Android 中间人攻击
  3. 管理系统中的计算机应用答案,《管理系统中计算机应用》试卷答案
  4. linux系统q7文件,linux系统安装包的管理
  5. java多线程上传文件_Java大文件分片上传/多线程上传
  6. SPOJ D-query 树状数组离线 求区间内不同数字的个数
  7. matlab 矩阵中的矩阵的特征值,当矩阵的所有条目都是变量时,如何在matlab中找出矩阵的特征值?...
  8. [leetcode]5354. 通知所有员工所需的时间
  9. huffman树--静态链表和链表实现(借助优先队列)
  10. 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列