问题:确保所有的Unicode字符串都拥有相同的底层

解决方案:为解决同一个文本拥有多种不同的表示形式问题,应该先将文本统一表示为规范形式,这可以通过unicodedata模块来完成,

unicodedata.normalize(字符串规定采用的规范,字符串)。

在Unicode中,有些特定的字符可以被表示成多种合法的代码点序列。

NFC:表示全组成的字符(即,如果可能的话就使用单个代码点);
NFD:表示组合字符,每个字符应该能完全分解开;
s1 = 'Spicy Jalape\u00f1o'  #Spicy Jalapeño使用的是字符“ñ” 的全组成形式(U+00F1)
s2 = 'Spicy Jalapen\u0303o' #Spicy Jalapeño使用的是拉丁字母“n”紧跟着一个“~”组合而成的字符(U+0303) # (a) Print them out (usually looks identical)
print(s1)
print(s2) # (b) Examine equality and length
print('s1 == s2 ?', s1 == s2)
print('len(s1)=',len(s1), 'len(s1)=',len(s2))
print ('---------------------------')
# (c) Normalize and try the same experiment
import unicodedata n_s1 = unicodedata.normalize('NFC', s1)
n_s2 = unicodedata.normalize('NFC', s2) print('n_s1 == n_s2 ?', n_s1 == n_s2)
print('len(n_s1)=',len(n_s1), 'len(n_s2)',len(n_s2))
print ('*****************************')
# (d) Example of normalizing to a decomposed form and stripping accents
t1 = unicodedata.normalize('NFD', s1)
t2 = unicodedata.normalize('NFD', s2)
print ('t1 == t2 ?',t1==t2)
print ('len(t1)=',len(t1),'len(t2)=',len(t2))
print(''.join(c for c in t1 if not unicodedata.combining(c)))
>>> ================================ RESTART ================================
>>>
Spicy Jalapeño
Spicy Jalapeño
s1 == s2 ? False
len(s1)= 14 len(s1)= 15
---------------------------
n_s1 == n_s2 ? True
len(n_s1)= 14 len(n_s2) 14
*****************************
t1 == t2 ? True
len(t1)= 15 len(t2)= 15
Spicy Jalapeno
>>>

补充:

在对文本进行过滤和净化时,规范化同样也占据了重要的部分。假设想从某些文本中去除所有的音符标记(可能为了搜索或匹配):

t1 = unicodedata.normalize('NFD', s1)
print(''.join(c for c in t1 if not unicodedata.combining(c))) unicodedata.combining()对字符做检查,判断它是否文一个组合型字符
这个例子展示了unicodedata模块的另一个重要功能:用来判断字符是否属于某个字符类型;

【python cookbook】【字符串与文本】9.将Unicode文本统一表示为规范形式的更多相关文章

  1. python cookbook 字符串和文本

    使用多个界定符分隔字符串 import re line = 'asdf fjdk; afed, fjek,asdf, foo' print(re.split(r'[;,\s]\s*', line)) ...

  2. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

  3. python基础——字符串

    Python的核心数据类型--字符串 常见字符串常量和表达式 操作 解释 s = '' 空字符串 s = "dodo's" 双引号和单引号 s = 'd\no\p\td\x00o' ...

  4. Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库

    15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode. 解决方案¶ 这里我们需要考 ...

  5. 【python cookbook】【字符串与文本】6.以不区分大小写的方式对文本做查找和替换

    问题:以不区分大小写的方式对文本做查找和替换 解决方法:使用re模块,并对各种操作都添加上re.IGNORECASE标记 text='UPPER PYTHON,lower python,Mixed P ...

  6. Python:字符串

    一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...

  7. python cookbook学习1

    python cookbook学习笔记 第一章 文本(1) 1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t ...

  8. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  9. Python 的字符串

    Python 的字符串 在最新的 Python 3 版本中,字符串是以 Unicode 编码的,也就是说,Python 的字符串支持多语言,例如: print('包含中文的 str') 对于单个字符的 ...

随机推荐

  1. http://blog.csdn.net/tiantiandjava/article/details/46777051

    http://blog.csdn.net/tiantiandjava/article/details/46777051

  2. LeetCode Peeking Iterator

    原题链接在这里:https://leetcode.com/problems/peeking-iterator/ 题目: Given an Iterator class interface with m ...

  3. Calculating simple running totals in SQL Server

    Running total for Oracle: SELECT somedate, somevalue,SUM(somevalue) OVER(ORDER BY somedate ROWS BETW ...

  4. Thinkpad E430 Ubuntu 14.04 无线网卡驱动

    为了重新安装正确的无线网卡的驱动,所以要先弄清楚我的笔记本上的无线网卡的具体的型号.打开终端,用如下命令/方法查看:lspci,找到输出信息中,有关无线网卡的部分.发现型号是:BCM43142 先用有 ...

  5. ionic环境搭建和安装

    1. 安装node环境 nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即可. Node官网: https://nodejs.org/ 安装完成后配置环境变量,计算机->属性 ...

  6. PHP不到100行代码实现SSO单点登录

    1.点击登录跳转到SSO登录页面并带上当前应用的callback地址2.登录成功后生成COOKIE并将COOKIE传给callback地址3.callback地址接收SSO的COOKIE并设置在当前域 ...

  7. Java对日期Date类进行加减运算,年份加减,月份加减

      import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; public class Da ...

  8. Hibernate三种状态的转换

    hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate ...

  9. IntelliJ IDEA 修改缓存文件设置

    今天在查看C盘,发现虽然我idea安装在了D盘,但是idea的缓存还是在C盘 config 目录是 IntelliJ IDEA 个性化化配置目录,或者说是整个 IDE 设置目录.也是我个人认为最重要的 ...

  10. ORA-28056:Writing audit records to Windows EventLog failed的问题

    右键“我的电脑”--‘管理’--事件查看器--点击左边的日志(应用程序日志.安全日志.系统日志),右击某个项目,选择‘清除所有事件'即可删除.