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