str
T 參數 | &T 參數 | &mut T 參數 | T 回傳值 | Option<T> 參數 | Option<T> 回傳值 | JavaScript 表示法 |
---|---|---|---|---|---|---|
否 | 是 | 否 | 否 | 否 | 否 | JavaScript 字串值 |
使用 TextDecoder
和 TextEncoder
將字串內容在 JavaScript 垃圾收集堆積和 Wasm 線性記憶體之間來回複製。如果您不想執行此複製,而是想使用 JavaScript 字串值的處理,請使用 js_sys::JsString
型別。
Rust 用法範例
# #![allow(unused_variables)] #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 vs 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
來測試字串是否包含不成對的代理字元。