[转载] Unicode文本排序和Unicode数据库
参考链接: 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数据库相关推荐
- 一个用于读unicode文本的迭代器(iterator)
written by chenghuige at gmail.com 也需有更好的方法我没有想到,但是没有在linux下面找到比较方便的读取unicode文本的方法. 用ICU,QT都太重量级了,于是 ...
- 开发小技巧之:unicode的排序和正则匹配
文章目录 简介 ASCII字符的排序 本地字符的排序 为什么不使用unicode进行排序 emoji的正则匹配 总结 简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑 ...
- 《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化
将 Unicode 文本标准化 问题 你正在处理 Unicode 字符串,需要确保所有字符串在底层有相同的表示. 解法 在 Unicode 中,某些字符能够用多个合法的编码表示.为了说明,考虑下面的这 ...
- 转载:文本编辑器 UltraEdit/EmEditor/EditPlus/AptEdit 之超级评测
转载:文本编辑器 UltraEdit/EmEditor/EditPlus/AptEdit 之超级评测 2009-07-15 18:32:25 文/deepview 出处: www.provesoft. ...
- python 中文转unicode编码_Python 解码 Unicode 转义字符串
其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...
- java是几位的unicode,下列说法错误的是()。A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种...
下列说法错误的是().A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种 更多相关问题 [名词解释] 捐躯juān qū [名词解释] 藕断丝连ǒu ...
- 【Java实现基于关键词的文本排序检索系统】
Java实现基于关键词的文本排序检索系统@TOC 注:个人的学习记录,勿用于其它途径 实验要求: (1)利用TF-IDF模型,为文本库中的文本创建索引(如倒排索引). (2)用户输入的关键词可以是一个 ...
- mapreduce文本排序_MapReduce:通过数据密集型文本处理
mapreduce文本排序 自上次发布以来已经有一段时间了,因为我一直忙于Coursera提供的一些课程. 有一些非常有趣的产品,值得一看. 前一段时间,我购买了Jimmy Lin和Chris Dye ...
- linux 文本排序、合并和分割 -转
sort [选项] [输入文件](文本排序) 选项: -c 测试文件是否已经被排序 -k 指定排序的域 -m 合并两个已排序的文件 -n 根据数字大小进行排序 -o[输出文件] 当输出写到指定的文件 ...
最新文章
- Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
- 【Java并发编程】并发容器之CopyOnWriteArrayList
- Spring boot默认日志配置
- 解决Unable to create group (name already exists)
- Vue.js——vue-resource全攻略
- 让linux服务器支持安全http协议(https)
- Oracle中的事务之savepoint
- 教你如何利用EXCEL制作动态仪表盘
- CVPR 9999 Best Paper——《一种加辣椒的番茄炒蛋》
- Django - - - -视图层之视图函数(views)
- linux硬盘打开ncq,linux下如何开启ncq
- 计算机无法发现网络共享打印机,win10发现不了共享打印机怎么办 共享打印机找不到的解决方法步骤...
- bigworld引擎
- python-pygame实现飞机大战-4-获取补给、发射强化子弹以及放大招清屏
- 51小项目——使用proteus搭建简易的光照度计-(1)
- 调整HTML5画布中图像的大小
- nginx启动流程之work初始化
- 单亲家庭父子的理财通信
- 部门来了个测试工程师,一副小毛孩样,本以为很菜,谁想到...
- mysql根据字母和数字进行排序
热门文章
- android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
- android客户端中间人攻击,Android 中间人攻击
- 管理系统中的计算机应用答案,《管理系统中计算机应用》试卷答案
- linux系统q7文件,linux系统安装包的管理
- java多线程上传文件_Java大文件分片上传/多线程上传
- SPOJ D-query 树状数组离线 求区间内不同数字的个数
- matlab 矩阵中的矩阵的特征值,当矩阵的所有条目都是变量时,如何在matlab中找出矩阵的特征值?...
- [leetcode]5354. 通知所有员工所需的时间
- huffman树--静态链表和链表实现(借助优先队列)
- 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列