在進行軟體開發的時候,我們可能會需要讓程式從外部讀取UTF-8資料再轉成程式語言內建的字串型別。其實UTF-8資料不必在完全讀取完後才去驗證其正確性,一邊讀取一邊驗證才是比較有效率的作法。
以Rust程式語言來說,我們可以使用std::string::String::from_utf8(vec)
關聯函數來驗證Vec<u8>
結構實體的資料是否為正確的UTF-8資料,如果是的話就將其轉換為String
結構體;也可以使用std::str::from_utf8(slice)
關聯函數來驗證u8
切片的資料是否為正確的UTF-8資料,如果是的話就複製一份並轉換為String
結構實體。然而,如果我們在取得UTF-8資料並將其儲存在記憶體的過程中就去驗證UTF-8的話,如果資料並不是正確的UTF-8,那我們也不必浪費記憶體空間和時間去儲存所有的資料。
UTF-8 Builder
「UTF-8 Builder」是筆者開發的套件,可以從組塊(chunk)建立並驗證UTF-8字串,每個組塊不必是完整的UTF-8資料。
Crates.io
Cargo.toml
utf8-builder = "*"
使用方法
utf8_builder
這個crate提供了Utf8Builder
結構體,Utf8Builder
結構實體提供了push
、push_str
、push_char
和push_chunk
方法可以用來在任何時候安全地讀取資料以建立出String
結構實體。當所有的資料都「push」進Utf8Builder
結構實體後,就可以使用finalize
方法來建立最終的String
結構實體。
use utf8_builder::Utf8Builder;
const TEXT1: &str = "is is English.";
const TEXT2: &str = "這是中文。";
let mut builder = Utf8Builder::new();
builder.push(b'T').unwrap();
builder.push_char('h').unwrap();
builder.push_str(TEXT1).unwrap();
builder.push_chunk(TEXT2.as_bytes()).unwrap();
let result = builder.finalize().unwrap();
assert_eq!(format!("Th{}{}", TEXT1, TEXT2), result);