在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...