NSString在不同字符集下的ASCII碼

2021-06-15 10:31:41 字數 4244 閱讀 6490

在ios中,xcode開發時一直沒理解字符集的關係。乙個字串賦值後,是什麼字符集組成的。我根據每乙個字元,分析它的ascii碼,然後得到一些特徵資訊。

例如這個字串"abc美國人123",有英文、漢字和數字。

nsstringencoding encoding2 = nsutf8stringencoding;

nsstring *teststr = @"abc美國人123";

for (int i = 0; i < [teststr length]; i++)

輸出結果如下:

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[0]=a = 97,1

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[1]=b = 98,1

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[2]=c = 99,1

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[3]=美 =美

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[3]=美 = 32654,3

2013-07-11 15:43:51.918 demo[2561:13d03] teststr[4]=國 = 22269,3

2013-07-11 15:43:51.919 demo[2561:13d03] teststr[5]=人 = 20154,3

2013-07-11 15:43:51.919 demo[2561:13d03] teststr[6]=1 = 49,1

2013-07-11 15:43:51.919 demo[2561:13d03] teststr[7]=2 = 50,1

2013-07-11 15:43:51.919 demo[2561:13d03] teststr[8]=3 = 51,1

這個字串是根據預設字符集進行編碼的,英文本元和數字可以很容易看出來,都是按照ascii字符集進行編碼,但漢字是採用什麼字符集呢?是預設字符集進行編碼的嗎?

我先從作業系統上去思考,是不是採用作業系統預設的字符集。那麼如何得到作業系統的預設字符集呢?

nsstring的幫助文件告訴我,使用defaultcstringencoding的nsstring類方法得到結果值為30,對應的編碼字符集是 nsmacosromanstringencoding。

這是在xcode中獲取的。其實它欺騙了我一下。

字串nsstring * teststr=@"abc美國人123";的賦值操作是在乙個檔案中進行的,字串的編碼方式應該首先是從檔案的編碼上去考慮的。檔案的編碼是什麼,字串就是什麼編碼。

在xcode中的text encoding是utf8,事先都設定好的。

其實,這點和eclipse開發工具是一樣的。很多時候,我們在eclipse看到源**檔案中很多亂碼字元,都是因為字符集轉換導致的。

因此,在xcode中,我們看到的字串的編碼方式就是utf8。

這個字串編碼可以做一些轉換操作。需要使用方法- (bool)canbeconvertedtoencoding:(nsstringencoding)encoding,判斷一下這個字串能不能無丟失轉換到對應的字符集編碼。

因為有些字符集可以轉到超字符集,但是有些不能轉,有些也不能逆轉。例如gb2312可以轉為gbk,但是就gbk不能轉到gb2312了。這取決於它的編碼方式。

gb2312是gbk的子集,gbk是gb18030的子集。

gbk是國家標準gb2312基礎上擴容後相容gb2312的標準。gbk的文字編碼是用雙位元組來表示的,即不論中、英文本元均使用雙位元組來表示,為了區分中文,將其最高位都設定成1。gbk包含全部中文字元,是國家編碼,通用性比utf8差,不過utf8占用的資料庫比gbd大。

gbk、gb2312等與utf8之間都必須通過unicode編碼才能相互轉換:

gbk、gb2312--unicode--utf8

utf8--unicode--gbk、gb2312

在從網際網路上獲取到資料流時需要根據不同的字符集nsutf8stringencoding、cfstringconvertencodingtonsstringencoding(kcfstringencodinggb_18030_2000)、nsmacosromanstringencoding 進行轉換操作。

nsstringencoding encodings = ;

for (int k = 0; k < 3; k++) else }}

輸出結果如下:

2013-07-11 16:21:49.875 demo[3557:13d03]   encode "abc美國人123" using encoding 4

2013-07-11 16:21:49.875 demo[3557:13d03] teststr[0]=a = 97,1

2013-07-11 16:21:49.875 demo[3557:13d03] teststr[1]=b = 98,1

2013-07-11 16:21:49.875 demo[3557:13d03] teststr[2]=c = 99,1

2013-07-11 16:21:49.876 demo[3557:13d03] teststr[3]=美 = 32654,3

2013-07-11 16:21:49.894 demo[3557:13d03] teststr[4]=國 = 22269,3

2013-07-11 16:21:49.894 demo[3557:13d03] teststr[5]=人 = 20154,3

2013-07-11 16:21:49.894 demo[3557:13d03] teststr[6]=1 = 49,1

2013-07-11 16:21:49.895 demo[3557:13d03] teststr[7]=2 = 50,1

2013-07-11 16:21:49.895 demo[3557:13d03] teststr[8]=3 = 51,1

2013-07-11 16:21:49.895 demo[3557:13d03]   encode "abc美國人123" using encoding 80000632

2013-07-11 16:21:49.895 demo[3557:13d03] teststr[0]=a = 97,1

2013-07-11 16:21:49.896 demo[3557:13d03] teststr[1]=b = 98,1

2013-07-11 16:21:49.896 demo[3557:13d03] teststr[2]=c = 99,1

2013-07-11 16:21:49.896 demo[3557:13d03] teststr[3]=美 = 32654,2

2013-07-11 16:21:49.896 demo[3557:13d03] teststr[4]=國 = 22269,2

2013-07-11 16:21:49.896 demo[3557:13d03] teststr[5]=人 = 20154,2

2013-07-11 16:21:49.897 demo[3557:13d03] teststr[6]=1 = 49,1

2013-07-11 16:21:49.897 demo[3557:13d03] teststr[7]=2 = 50,1

2013-07-11 16:21:49.897 demo[3557:13d03] teststr[8]=3 = 51,1

2013-07-11 16:21:49.897 demo[3557:13d03]   encode "abc美國人123" using encoding 1e

2013-07-11 16:21:49.897 demo[3557:13d03]     can not encode "abc美國人123" using encoding 1e

從結果上可以看到三點:

1、在字符集編碼為nsutf8stringencoding時可以轉換。當然了,本來就是utf8編碼的。

2、在字符集編碼為gbk時,也可以。因為字元是漢字,並且utf8的編碼範圍比gbk大,所以轉換沒有丟失資料。

3、在字符集編碼為nsmacosromanstringencoding時,就不行了。

在不同的字符集下,獲取的每乙個字元的位元組數已經不一樣的,utf8下漢字三個位元組編碼,gbk下是兩個。這點沒有疑問。

有疑問的是,為什麼獲取的每乙個字元的ascii編碼都是一樣的。

我以漢字"美"為例,在utf8下測試獲得ascii碼的值是15712189,在gbk下獲取的ascii碼的值是50112。

難道測試的方法有問題?

MFC在Unicode字符集下讀寫ANSI編碼檔案

讀取ansi編碼檔案時,先將檔案儲存在char 指向的記憶體內,而後使用轉換將char 轉換為w char t wchar t 可以使用cstring的 format函式。cfile file t test.txt cfile moderead 讀ansi編碼的檔案 int filelen file...

mysql api 字符集 MySQL字符集

mysql字符集包括字符集 character 和 collation 兩個概念。字符集是用來定義mysql儲存字串的規則,校對規則則是定義了比較字串的方式。字串和校對規則是一對多的 關係。使用命令 show collation like gbk 可檢視相關的校對規則 使用 show charact...

Unicode字符集和多字符集

由於各國語言的加入,ascii已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ascii的基礎上制定了自己的字符集,它們正式的名稱應該是mbcs multi byte chactacter system,即多位元組字元系統 型別說明 unicode ansi 通用型別 字元wch...