ruby直到1.9版本才很好的支援了多位元組編碼,本文簡單總結了今天學習的關於ruby編碼方面的知識。
在.net中字串的編碼是一致的,ruby允許字串有不同的編碼,當時我就在想:如果兩個不同編碼的字串相加會出現什麼結果?
測試程式
1輸出結果#coding: utf-8
23 str_utf8 = "
hi 段
"4 puts str_utf8.size #
45 puts str_utf8.bytesize #
66 puts str_utf8 .encoding #
utf-8
7 str_utf8.each_byte #
68,69,20,e6,ae,b5,
8puts910
puts
1112 str_gb2312 = "
hi 段
".encode("
gb2312")
13 puts str_gb2312.size #
414 puts str_gb2312.bytesize #
515 puts str_gb2312 .encoding #
gb2312
16 str_gb2312.each_byte #
68,69,20,b6,ce,
17 puts
1 4備註:utf-8對英文採用1個位元組,對中文採用三個位元組。gb2312對英文採用1個位元組,對中文採用兩個位元組。2 63 utf-8
4 68,69,20,e6,ae,b5,
56 4
7 58
gb2312
9 68,69,20,b6,ce,
編碼轉換可以採用string::encode("目標編碼名稱")來完成,如果編碼之間的轉換相容,返回編碼後的字串,否則會丟擲編碼轉換異常。
測試程式
1輸出結果begin
2 puts "
段".encode("
ascii")
3 rescue exception =>e
4 puts e.class
5end
67 puts "
段".encode("
gb2312
")
1備註:encode會返回乙個和元字串序列一樣的字串序列,只是內部的位元組序列改變了。encoding::undefinedconversionerror
2 段
編碼強制是指在不改變位元組序列的情況下改變對位元組的解釋方式,編碼強制:string::force_encoding("強制編碼")。
測試程式
1 utf8_str = "輸出結果\xe6\xae\xb5
".encode("
utf-8")
2 puts utf8_str.encoding() #
utf-8
3 puts utf8_str.size #
14 puts utf8_str.bytesize #35
6 ascii_str = "
\xe6\xae\xb5
".force_encoding("
ascii")
7 puts ascii_str.encoding() #
us-ascii
8 puts ascii_str.size #
39 puts ascii_str.bytesize #
310 puts ascii_str.valid_encoding? #
false
1 utf-8備註:string::valid_encoding?可以判定是否是有效的強制。2 13 3
4 us-ascii
5 36 3
7 false
這個問題的答案很簡單:如果兩個字串的編碼相容,則返回字符集最大的編碼,否則跑出不相容異常。你可以自己檢查相容性:encoding.compatible?。
測試程式
1 str_ascii = "執行結果hi ".encode("
ascii")
2 str_utf8 = "段"
3puts str_ascii.encoding
4puts str_utf8.encoding
5puts encoding.compatible?(str_ascii.encoding, str_utf8.encoding)
6 puts (str_ascii +str_utf8).encoding
7 puts (str_utf8 + str_ascii).encoding
1 us-ascii幾乎所有的語言都支援這兩個轉義字元,允許我們使用\u***x指定unicode碼點對於的字元,通用也執行我們使用\***指定位元組。2 utf-8
3 utf-8
4 utf-8
5 utf-8
測試程式
1 puts "段"輸出結果#段2 puts "
\xe6\xae\xb5"#
段3 puts "
\u6bb5"#
段
1#段測試程式2#段3
#段
1 puts "段"在sublime中的輸出結果2 puts "
段".encode("
gb2312
")
1 [decode error - output not utf-8]在控制台的輸出結果
原因分析
sublime之所以失敗是因為sublime重定位了預設標準輸出流,而重定位後的流不支援混合多種編碼,說白了:你沒法在乙個檔案中儲存兩種編碼的字串。
備註:sublime中的失敗不是ruby導致的,是sublime自身的問題。
如何解決?
sublime預設只能接收utf8編碼,因此必須轉換為utf8編碼。
1輸出結果#預設是utf8編碼,不用處理。
2 puts "段"
3#執行windows命令必須使用gb2312編碼。
4 command = "
echo 段
".encode("
gb2312")
5#命令執行的結果想輸出到sublime必須使用utf8編碼。
6 puts `#
`.encode("utf-8")
1字串、字符集和編碼算是剛入門,有機會還得繼續學習。# 輸出結果2段
3 段
字符集和字元編碼學習總結
3.unicode 字符集 utf 8 編碼 4.總結 參考 個人部落格 想要弄明白文字的編碼是怎麼回事,繞不過去字符集和字元編碼這兩個概念。我們知道,位元組是計算機中對二進位制序列表達最常用的單位,一位元組的長度是8位,能夠表達256種不同的狀態,也就是256個不同的字元。每一種技術的出現,伴隨其...
字符集和字元編碼學習
做嵌入式應用軟體開發,總是少不了要跟字符集和字元編碼打交道。字符集是各種文字和符號的總稱。常見的字符集有ascii字符集 gb2312字符集 big5字符集 unicode字符集等,每一種字符集支援的字元個數並不相同。因為計算機無法像人類一樣識別自然界中的具體事物,它只能識別0和1這兩個二進位制數字...
字符集 字元編碼總結
字符集 charset 是乙個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等。字元編碼 是一套規則,將字元和二進位制資料建立對映關係。1 ascll american standard code for information interchan...