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