首页 > 其他分享 >NSString 与 Unicode

NSString 与 Unicode

时间:2024-10-16 17:00:40浏览次数:6  
标签:字符 编码 UTF 16 NSString Unicode

英文: https://www.objc.io/issues/9-strings/unicode/

https://learn.microsoft.com/en-us/dotnet/api/system.string.normalize?view=net-8.0

 

当你在处理文本时,如果你不是在写一些非常古老的代码(legacy code),那么你一定要使用 Unicode。幸运的是,苹果和 NeXT 一直致力于推动 Unicode 标准的建立,而 NeXT 在 1994 年推出的 Foundation Kit 则是所有编程语言中最先基于 Unicode 的标准库之一。但是,即使 NSString 完全支持 Unicode,还替你干了大部分的重活儿,处理各种语言、各种书写系统的文本仍然是一个非常复杂的事情。作为一个程序员,有些事情你应该知道。

这篇文章里,我会先向你简单地讲一下 Unicode 这个标准,然后解释 NSString 是怎么处理它的,再讨论一下你可能会遇到的一些常见问题。

历史

计算机没法直接处理文本,它只和数字打交道。为了在计算机里用数字表示文本,我们指定了一个从字符到数字的映射。这个映射就叫做编码(encoding)

最有名的一个字符编码是 ASCII。ASCII 码是 7 位的,它将英文字母,数字 0-9 以及一些标点符号和控制字符映射为 0-127 这些整型。随后,人们创造了许多不同的 8 位编码来处理英语以外的其他语言。它们大多都是基于 ASCII 编码的,并且使用了 ASCII 没有使用的第 8 位来编入其它字母、符号甚至是整个字母表(比如西里尔字母和希腊字母)。

当然,这些编码系统相互之间并不兼容,并且,由于 8 位的空间对于欧洲的文字来说都不够,更不用说全世界的书写系统了,因此这种不兼容是肯定会出现的了。这对于当时基于文本的操作系统来说是很麻烦的,因为那时操作系统只能同时使用一种编码(也叫做内码表,code page)。如果你在一台机器上写了一段文字,然后在另一台使用了不同的内码表的机器上打开,那么在 128-255 这个范围内的字符就会显示错误。

诸如中文、日文和韩文的东亚文字又让情况更加复杂。这些书写系统里包含的字符实在是太多了,以至于 8 位的数字所能提供的 256 个位置远远不够。结果呢,人们开发了更加通用的编码(通常是 16 位的)。当你开始纠结于如何处理一个字节装不下的值时,如何把它存储到内存或者硬盘里就变得十分关键了。这时,就必须再进行第二次映射,以此来确定字节的顺序。而且,最好使用可变长度的编码而不是固定长度的。请注意,第二次映射其实是另一种形式的“编码”。我们把这两个映射都叫做“编码”很容易造成误解。这个在下面 UTF-8 和 UTF-16 的部分里会再作讨论。

现代操作系统都已经不再局限于只能同时使用一种内码表了,因此只要每个文档都清楚地标明自己使用的是哪种编码,处理几十甚至上百种编码系统尽管很讨厌,也完全是有可能的。真正不可能的是在一个文档里_混合_使用多种编码系统,因此撰写多语言的文档也不可能了,而正是这一点终结了在 Unicode 编码出现之前,多种编码混战的局面。

1987 年,来自几个大的科技公司(其中包括苹果和 NeXT)的工程师们开始合作致力于开发一种能在全世界所有书写系统中通用的字符编码系统,于 1991 年 10 月发布的 1.0.0 版本的 Unicode 标准就是这一努力的成果。

Unicode 概要

基本介绍

简单地来说,Unicode 标准为世界上几乎所有的[^1]书写系统里所使用的每一个字符或符号定义了一个唯一的数字。这个数字叫做码点(code points),以 U+xxxx 这样的格式写成,格式里的 xxxx 代表四到六个十六进制的数。比如,U+0041(十进制是 65)这个码点代表拉丁字母表(和 ASCII 一致)里的字母 A;U+1F61B 代表名为“伸出舌头的脸”的 emoji,也就是

标签:字符,编码,UTF,16,NSString,Unicode
From: https://www.cnblogs.com/Charltsing/p/18470326/NSStringAndUnicode

相关文章

  • Some bytes have been replaced with the Unicode substitution character while load
    需要修改一较旧的网页代码,当打开时,却出现异常提示: SomebyteshavebeenreplacedwiththeUnicodesubstitutioncharacterwhileloadingfile【文档路径】withUnicode(UTF-8)encoding.Savingthefilewillnotpreservetheoriginalfilecontents.点“OK”,文档是......
  • iOS NSString 使用Copy修饰,而不使用Strong修饰
    其实老实讲,定义@property属性,“使用Copy修饰,而不是用Strong修饰”这句话也不完全正确.因为如果他们对接的是不可变字符串,那么无论使用哪个都一样.问题就出现在,如果他们对接的是可变字符串NSMutableString,那就得用copy定义两个NSString属性:@interfaceViewControll......
  • UNICODE环境下,RichEditCtrl 控件 RTF字符串的读写
    UNICODE编译环境:RTF字符串的显示:如果是CRichEditView,可以直接用SetWindowText,输入的RTF字符串是UNCODE编码。如果是CRichEditCtrl,可以发消息显示,输入的字符串是UNCODE编码intCNoteView::SetRTF(TCHAR*pRtf) { intlen=_tcslen(pRtf); //::SendMessage(m_hWndREdit,EM_SE......
  • NSStringDrawingOptions
    在Swift中,boundingRect(with:options:attributes:context:)方法的options参数使用的是NSStringDrawingOptions枚举。以下是这个枚举的所有选项及其说明:NSStringDrawingOptions枚举usesLineFragmentOrigin说明:这个选项表示文本的计算是基于文本块的边界。即文本会......
  • 字符编码发展史4 — Unicode与UTF-8
    上一篇《字符编码发展史3—GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。2.3.第三个阶段国际化前面提到的第二个阶段,各个国家和地区各自为政,纷纷制定了适用于自己国家语言的字......
  • 深入解析:Unicode 与 UTF-8 在 Python 中的秘密武器
    引言字符编码是计算机科学中的一个重要领域,它定义了如何将人类可读的文字转换为机器能够理解的形式。随着互联网的发展,不同的语言和符号需要在全球范围内共享,这就对字符编码提出了更高的要求。Unicode标准就是为了满足这种需求而诞生的,它提供了一套统一的字符集,几乎涵盖了所有现代......
  • 03 第四组 2个 unicode码点 随机生成汉字与字母
    unicode码点A对应的二进制010000中对应的二进制....国对应的二进制.....ord根据文本获取十进制数v1=ord("A")v2=ord("中")print(v1,hex(v1),''.join(hex(v1)[2:].rjust(4,'0')))#650x410041print(v2,hex(v2),''.join......
  • flask db upgrade出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in
    Traceback(mostrecentcalllast):File"<frozenrunpy>",line198,in_run_module_as_mainFile"<frozenrunpy>",line88,in_run_codeFile"D:\pycharm_project\rag-api\api\.venv\Scripts\flask.exe\__main__......
  • json.dumps(data.__dict__) 会把中文字符转义为 Unicode 码点
    在Python中,json.dumps()函数会将Python对象序列化为JSON字符串,并默认使用UTF-8编码来处理非ASCII字符。虽然在Python3中,字符串是默认以Unicode形式存储的,但是当json.dumps()将Python字符串转换为JSON格式时,非ASCII字符会自动被转义为Unicode码点(例如\u......
  • PHP批量修改MySQL数据表字符集为utf8mb4/utf8mb4_unicode_ci
    编码大全可参考我之前的文章:快速理解ASCII、GBK、Unicode、UTF-8、ANSI批量修改注意这是DDL操作,操作过程会锁表(元数据锁),平均1秒能够转码3张表(数据量不大)。亲测操作过后没有数据异常,推荐执行前备份。//接手一些老项目,需要修改编码。$host='';$db='';$user='';$pa......