设为首页 加入收藏

TOP

深入理解苹果系统(Unicode)字符串的排序方法(一)
2019-08-31 00:21:37 】 浏览:69
Tags:深入 理解 苹果 系统 Unicode 字符串 排序 方法

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由iminder发表于云+社区专栏

Unicode编码

我们知道计算机是不能直接处理文本的,而是和数字打交道。因此,为了表示文本,就建立了一个字符到数字的映射表,叫做编码。最著名的字符编码就是ASCII了,它使用7-bit来表示应用字母表以及数字和其他字符。这对于英语来说是够用了,但是对于其他语言,这个7-bit就不能满足条件了,因为字符远远超过了7-bit所能表示的最大个数。因此1987年,来自几个大的科技公司的工程师开始合作开发一种致力于能在全世界的所有书写系统中都能通用的字符编码系统,并与1991年10发布了Unicode的1.0.0标准。2018年6月发布了Unicode的11.0版本。这里就不再对Unicode做过多的介绍,值得注意的是,在iOS开发中,常使用的的NSString是基于Unicode-16来开发的,这是因为当时开发这个的时候Unicode标准还是以16bit固定长度来编码,这就导致使用上的一些坑,建议大家阅读下这篇文章:NSString and Unicode

#UCA和CLDR:最常用到的排序标准

介绍完Unicode编码之后,我们就可以来介绍UCA(Unicode Collation Algorithm)和CLDR(Common Locale Data Repository)了,因为苹果的NSString的介绍文档里有这么一句话:

Localized string comparisons are based on the Unicode Collation Algorithm, as tailored for different languages by CLDR (Common Locale Data Repository). Both are projects of the Unicode Consortium. Unicode is a registered trademark of Unicode, Inc.

说白了,苹果系统的NSString字符串排序是基于UCA的,并且在不同语言下,经过CLDR来裁剪的。

UCA(Unicode Collation Algorithm)

UCA的介绍官方文档介绍在这里:UCA介绍。其中第一句话就写的很清楚,

Collation is the general term for the process and function of determining the sorting order of strings of characters.

对字符串排序的过程就是Collation,UCA就是Unicode表示的字符串进行排序的规则,制定这个规则的原因是不同语种对字符串的排序规则要求是不一样的,比如,德国、法国和瑞士对相同的字符排序的规则是不一样的,甚至在同一个语言下比如中文,多音字这种在不同组合里,排序的先后顺序也是不一样的。

img差异化举例

因此可以想象,UCA指定的规则比较复杂。感兴趣的可以读下前面贴的UCA介绍,里面有具体的排序规则介绍。

CLDR(Common Locale Data Repository)

CLDR的官方文档在这里:CLDR介绍。CLDR是一堆语言数据仓库,为软件提供各种世界语言版本提供了基础,目前在使用CLDR的公司有:

Apple (macOS, iOS, watchOS, tvOS, and several applications; Apple Mobile Device Support and iTunes for Windows; …) Google (Web Search, Chrome, Android, Adwords, Google+, Google Maps, Blogger, Google Analytics, …) IBM (DB2, Lotus, Websphere, Tivoli, Rational, AIX, i/OS, z/OS,…) Microsoft (Windows, Office, Visual Studio, …)

其他公司:

ABAS Software, Adobe, Amazon (Kindle), Amdocs, Apache, Appian, Argonne National Laboratory, Avaya, Babel (Pocoo library), BAE Systems Geospatial eXploitation Products, BEA, BluePhoenix Solutions, BMC Software, Boost, BroadJump, Business Objects, caris, CERN, Debian Linux, Dell, Eclipse, eBay, EMC Corporation, ESRI, Firebird RDBMS, FreeBSD, Gentoo Linux, GroundWork Open Source, GTK+, Harman/Becker Automotive Systems GmbH, HP, Hyperion, Inktomi, Innodata Isogen, Informatica, Intel, Interlogics, IONA, IXOS, Jikes, jQuery, Library of Congress, Mathworks, Mozilla, Netezza, OpenOffice, Oracle (Solaris, Java), Lawson Software, Leica Geosystems GIS & Mapping LLC, Mandrake Linux, OCLC, Perl, Progress Software, Python, QNX, Rogue Wave, SAP, Shutterstock, SIL, SPSS, Software AG, SuSE, Symantec, Teradata (NCR), ToolAware, Trend Micro, Twitter, Virage, webMethods, Wikimedia Foundation (Wikipedia), Wine, WMS Gaming, XyEnterprise, Yahoo!, Yelp

对于不同区域(local),可以找到不同的数据CLDR,结合UCA对字符串进行排序,就做到了不同语言下的本地化排序。可以去 http://cldr.unicode.org/ 下载最新的CLDR库,后面将会用到里面的一些内容。

字符分类与排序规则

字符分类与Unicode码点值排序

Unicode把所有的字符分为两类:

  1. common charaters 包括空格,标点,通用符号,货币符号,数字等。
  2. script charaters 包括拉丁字母,希腊字母,汉字等。 这样经过分类,便于把一类字符统一集中在一起。

通常情况下,我们是通过unicode 的UTF-16码点值逐个进行比较大小的来进行排序的。

NSArray *rawArray = @[@"爱你", @"一生一世",@"?", @"上",@"?",@"μ",@"язык",@"..",@"123",@"@",@"AA",@"abc",@"abb&quo
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇虹软人脸识别iOS SDK2.0 下一篇【OC底层】Category、+load方法、..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目