str

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

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