str
T 參數 | &T 參數 | &mut T 參數 | T 回傳值 | Option<T> 參數 | Option<T> 回傳值 | JavaScript 表示法 |
---|---|---|---|---|---|---|
否 | 是 | 否 | 否 | 否 | 否 | JavaScript 字串值 |
使用 TextDecoder
和 TextEncoder
在 JavaScript 垃圾回收堆積和 Wasm 線性記憶體之間來回複製字串的內容。如果您不想執行此複製,而寧願使用 JavaScript 字串值的控制代碼,請使用 js_sys::JsString
類型。
Rust 使用範例
#![allow(unused)] fn main() { use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn take_str_by_shared_ref(x: &str) {} }
JavaScript 使用範例
import {
take_str_by_shared_ref,
} from './guide_supported_types_examples';
take_str_by_shared_ref('hello');
UTF-16 與 UTF-8
JavaScript 中的字串以 UTF-16 編碼,但有一個主要的例外:它們可以包含不成對的代理。對於某些 Unicode 字元,UTF-16 使用兩個 16 位元值。這些被稱為「代理對」,因為它們總是成對出現。在 JavaScript 中,這些代理對可能會遺失另一半,從而產生「不成對的代理」。
從 JavaScript 傳遞字串到 Rust 時,它會使用 TextEncoder
API 從 UTF-16 轉換為 UTF-8。這通常是完全沒問題的...除非有不成對的代理。在這種情況下,它會將不成對的代理取代為 U+FFFD (�,替換字元)。這表示 Rust 中的字串現在與 JavaScript 中的字串不同!
如果您想要保證 Rust 字串與 JavaScript 字串相同,您應該改用 js_sys::JsString
(它將字串保留在 JavaScript 中,並且不會將其複製到 Rust 中)。
如果您想要存取 JS 字串的原始值,您可以使用 JsString::iter
,它會回傳一個 Iterator<Item = u16>
。這會完美地保留所有內容 (包括不成對的代理),但它不會進行任何編碼 (因此您必須自行處理!)。
如果您只想忽略包含不成對代理的字串,您可以使用 JsString::is_valid_utf16
來測試該字串是否包含不成對的代理。