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 来测试字符串是否包含不成对的代理项。