str

T 參數&T 參數&mut T 參數T 回傳值Option<T> 參數Option<T> 回傳值JavaScript 表示法
JavaScript 字串值

使用 TextDecoderTextEncoder 在 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 來測試該字串是否包含不成對的代理。