按照作者的意思,字元不是看起來那麼簡單!
的確,字元在大部分語言中,都不是看起來那麼簡單!
字元的內容看起來很多,又很少!
多是因為涉及到編碼、構成、方法(有許多方法)還有字元切片。
少是因為,其實和java等語言其實沒有大的區別。
一、構成
rust的字元內部是 vec(u8)+方法,看起來和java其實區別不大,至少在邏輯層面,大家差不多!
rust.String定義
java.String定義(jdk17,摘選)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence, Constable, ConstantDesc { @Stable private final byte[] value; }
沒有太多本質的區別,大家都有陣列儲存實際的值,不同的是java儲存的是位元組陣列,而rust儲存的u8陣列。
這都是表面的,其實都是一個位元組陣列。
如果用的是rustOver,那麼檢視原始碼還是比較方便的,操作方式和eclipse,idea一樣,ctrl+點選滑鼠左鍵。
如上圖,點選紅色矩形中的String,即可跳轉到String.rs
二、示例
上例中,使用字串切片,這個其實和字串沒有本質的區別,因為前者是對字串的區域性引用。
上例中,演示了企圖透過索引/或者切片的方式訪問多位元組utf-8字元的部分資料時發生錯誤的情形。
這種情況下,會給出足夠好友的提示! 這也是rustc的一大優點。
根據這個提示,如果把上文的程式碼改為:
println!("{}的第一個字元是:{}",cn,&cn[0..3]);
那麼還是可以正確執行的!
需要逐個列印字串的每個字元,可以使用以下方式:
let cn:String="中華人民共和國".to_string();
println!("cn的包含了以下幾個漢字:");
for c in cn.chars(){
println!("{}",c);
}
三、小結
才看了個頭,不敢說對String有什麼深入瞭解,所以就說一些基本的:
- rust的String和其它語言(java)並沒有大的區別
- 注意rust使用utf-8來儲存字元的,無法指定其它字符集。如果要達到那個目的,只能另尋他途
- 採用utf-8對於GBK編碼的並不友好,無疑多少要會浪費一些空間和效能.如果是java就十分方便,只要指定GBK編碼即可.