在進行軟體開發的時候,我們可能會需要讓程式從外部讀取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

https://crates.io/crates/utf8-builder

Cargo.toml

utf8-builder = "*"

使用方法

utf8_builder這個crate提供了Utf8Builder結構體,Utf8Builder結構實體提供了pushpush_strpush_charpush_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);