鍍金池/ 教程/ iOS/ NSString 與 Unicode
與四軸無人機(jī)的通訊
在沙盒中編寫腳本
結(jié)構(gòu)體和值類型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動開發(fā)
Collection View 動畫
截圖測試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動布局工具箱
動畫
為 iOS 7 重新設(shè)計 App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動畫解釋
響應(yīng)式 Android 應(yīng)用
初識 TextKit
客戶端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項目介紹
Swift 的強(qiáng)大之處
測試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計優(yōu)雅的移動游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動畫
常見的后臺實踐
糟糕的測試
避免濫用單例
數(shù)據(jù)模型和模型對象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計的藝術(shù)
導(dǎo)航應(yīng)用
線程安全類的設(shè)計
置換測試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無人機(jī)項目
Mach-O 可執(zhí)行文件
UI 測試
值對象
活動追蹤
依賴注入
Swift
項目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測試 View Controllers
訪談
收據(jù)驗證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場
游戲
調(diào)試核對清單
View Controller 容器
學(xué)無止境
XCTest 測試實戰(zhàn)
iOS 7
Layer 中自定義屬性的動畫
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫支持
Fetch 請求
導(dǎo)入大數(shù)據(jù)集
iOS 開發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語言標(biāo)簽
同步案例學(xué)習(xí)
依賴注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過程

NSString 與 Unicode

當(dāng)你在處理文本時,如果你不是在寫一些非常古老的代碼(legacy code),那么你一定要使用 Unicode。幸運(yùn)的是,蘋果和 NeXT 一直致力于推動 Unicode 標(biāo)準(zhǔn)的建立,而 NeXT 在 1994 年推出的 Foundation Kit 則是所有編程語言中最先基于 Unicode 的標(biāo)準(zhǔn)庫之一。但是,即使 NSString 完全支持 Unicode,還替你干了大部分的重活兒,處理各種語言、各種書寫系統(tǒng)的文本仍然是一個非常復(fù)雜的事情。作為一個程序員,有些事情你應(yīng)該知道。

這篇文章里,我會先向你簡單地講一下 Unicode 這個標(biāo)準(zhǔn),然后解釋 NSString 是怎么處理它的,再討論一下你可能會遇到的一些常見問題。

歷史

計算機(jī)沒法直接處理文本,它只和數(shù)字打交道。為了在計算機(jī)里用數(shù)字表示文本,我們指定了一個從字符到數(shù)字的映射。這個映射就叫做編碼(encoding)

最有名的一個字符編碼是 ASCII。ASCII 碼是 7 位的,它將英文字母,數(shù)字 0-9 以及一些標(biāo)點(diǎn)符號和控制字符映射為 0-127 這些整型。隨后,人們創(chuàng)造了許多不同的 8 位編碼來處理英語以外的其他語言。它們大多都是基于 ASCII 編碼的,并且使用了 ASCII 沒有使用的第 8 位來編入其它字母、符號甚至是整個字母表(比如西里爾字母和希臘字母)。

當(dāng)然,這些編碼系統(tǒng)相互之前并不兼容,并且,由于 8 位的空間對于歐洲的文字來說都不夠,更不用說全世界的書寫系統(tǒng)了,因此這種不兼容是肯定會出現(xiàn)的了。這對于當(dāng)時基于文本的操作系統(tǒng)來說是很麻煩的,因為那時操作系統(tǒng)只能同時使用一種編碼(也叫做內(nèi)碼表,code page)。如果你在一臺機(jī)器上寫了一段文字,然后在另一臺使用了不同的內(nèi)碼表的機(jī)器上打開,那么在 128-255 這個范圍內(nèi)的字符就會顯示錯誤。

諸如中文、日文和韓文的東亞文字又讓情況更加復(fù)雜。這些書寫系統(tǒng)里包含的字符實在是太多了,以至于 8 位的數(shù)字所能提供的 256 個位置遠(yuǎn)遠(yuǎn)不夠。結(jié)果呢,人們開發(fā)了更加通用的編碼(通常是 16 位的)。當(dāng)你開始糾結(jié)于如何處理一個字節(jié)裝不下的值時,如何把它存儲到內(nèi)存或者硬盤里就變得十分關(guān)鍵了。這時,就必須再進(jìn)行第二次映射,以此來確定字節(jié)的順序。而且,最好使用可變長度的編碼而不是固定長度的。請注意,第二次映射其實是另一種形式的“編碼”。我們把這兩個映射都叫做“編碼”很容易造成誤解。這個在下面 UTF-8 和 UTF-16 的部分里會再作討論。

現(xiàn)代操作系統(tǒng)都已經(jīng)不再局限于只能同時使用一種內(nèi)碼表了,因此只要每個文檔都清楚地標(biāo)明自己使用的是哪種編碼,處理幾十甚至上百種編碼系統(tǒng)盡管很討厭,也完全是有可能的。真正不可能的是在一個文檔里_混合_使用多種編碼系統(tǒng),因此撰寫多語言的文檔也不可能了,而正是這一點(diǎn)終結(jié)了在 Unicode 編碼出現(xiàn)之前,多種編碼混戰(zhàn)的局面。

1987 年,來自幾個大的科技公司(其中包括蘋果和 NeXT)的工程師們開始合作致力于開發(fā)一種能在全世界所有書寫系統(tǒng)中通用的字符編碼系統(tǒng),于 1991 年 10 月發(fā)布的 1.0.0 版本的 Unicode 標(biāo)準(zhǔn)就是這一努力的成果。

Unicode 概要

基本介紹

簡單地來說,Unicode 標(biāo)準(zhǔn)為世界上幾乎所有的1書寫系統(tǒng)里所使用的每一個字符或符號定義了一個唯一的數(shù)字。這個數(shù)字叫做碼點(diǎn)(code points),以 U+xxxx 這樣的格式寫成,格式里的 xxxx 代表四到六個十六進(jìn)制的數(shù)。比如,U+0041(十進(jìn)制是 65)這個碼點(diǎn)代表拉丁字母表(和 ASCII 一致)里的字母 A;U+1F61B 代表名為“伸出舌頭的臉”的 emoji,也就是

上一篇:Core Data下一篇:回到 Mac