日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ruby:字符集和编码学习总结

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ruby:字符集和编码学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

Ruby直到1.9版本才很好的支持了多字節編碼,本文簡單總結了今天學習的關于Ruby編碼方面的知識。

字符串可以使用不同的編碼

在.NET中字符串的編碼是一致的,Ruby允許字符串有不同的編碼,當時我就在想:如果兩個不同編碼的字符串相加會出現什么結果?

測試程序

1 # coding: utf-8 2 3 str_utf8 = "hi 段" 4 puts str_utf8.size # 4 5 puts str_utf8.bytesize # 6 6 puts str_utf8 .encoding # UTF-8 7 str_utf8.each_byte {|b| print "%02X," % [b]} # 68,69,20,E6,AE,B5, 8 puts 9 10 puts 11 12 str_gb2312 = "hi 段".encode("gb2312") 13 puts str_gb2312.size # 4 14 puts str_gb2312.bytesize # 5 15 puts str_gb2312 .encoding # GB2312 16 str_gb2312.each_byte {|b| print "%02X," % [b]} # 68,69,20,B6,CE, 17 puts

輸出結果

1 4 2 6 3 UTF-8 4 68,69,20,E6,AE,B5, 5 6 4 7 5 8 GB2312 9 68,69,20,B6,CE,

備注:UTF-8對英文采用1個字節,對中文采用三個字節。GB2312對英文采用1個字節,對中文采用兩個字節。

編碼轉換

編碼轉換可以采用String::encode("目標編碼名稱")來完成,如果編碼之間的轉換兼容,返回編碼后的字符串,否則會拋出編碼轉換異常。

測試程序

1 begin 2 puts "".encode("ascii") 3 rescue Exception => e 4 puts e.class 5 end 6 7 puts "".encode("gb2312")

輸出結果

1 Encoding::UndefinedConversionError 2

備注:encode會返回一個和元字符串序列一樣的字符串序列,只是內部的字節序列改變了。

編碼強制

編碼強制是指在不改變字節序列的情況下改變對字節的解釋方式,編碼強制:String::force_encoding("強制編碼")。

測試程序

1 utf8_str = "\xE6\xAE\xB5".encode("utf-8") 2 puts utf8_str.encoding() # UTF-8 3 puts utf8_str.size # 1 4 puts utf8_str.bytesize # 3 5 6 ascii_str = "\xE6\xAE\xB5".force_encoding("ascii") 7 puts ascii_str.encoding() # US-ASCII 8 puts ascii_str.size # 3 9 puts ascii_str.bytesize # 3 10 puts ascii_str.valid_encoding? # false

輸出結果

1 UTF-8 2 1 3 3 4 US-ASCII 5 3 6 3 7 false

備注:String::valid_encoding?可以判定是否是有效的強制。

不同編碼的字符串相加后是啥結果?

這個問題的答案很簡單:如果兩個字符串的編碼兼容,則返回字符集最大的編碼,否則跑出不兼容異常。你可以自己檢查兼容性:Encoding.compatible?。

測試程序

1 str_ascii = "hi ".encode("ascii") 2 str_utf8 = "" 3 puts str_ascii.encoding 4 puts str_utf8.encoding 5 puts 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 2 UTF-8 3 UTF-8 4 UTF-8 5 UTF-8

一直沒使用過的\u和\x

幾乎所有的語言都支持這兩個轉義字符,允許我們使用\uXXXX指定Unicode碼點對于的字符,通用也運行我們使用\xXX指定字節。

測試程序

1 puts "" # 2 puts "\xE6\xAE\xB5" # 3 puts "\u6BB5" #

輸出結果

1 # 2 # 3 #

使用Sublime開發Ruby時,輸出到控制臺的字符串為啥不能使用多種編碼?

測試程序

1 puts "" 2 puts "".encode("GB2312")

在Sublime中的輸出結果

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 `#{command}`.encode("utf-8")

輸出結果

1 # 輸出結果 2 3

備注

字符串、字符集和編碼算是剛入門,有機會還得繼續學習。

?

轉載于:https://www.cnblogs.com/happyframework/p/3275367.html

總結

以上是生活随笔為你收集整理的Ruby:字符集和编码学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。