String.prototype.toWellFormed()
语法
js
toWellFormed()
参数
无。
返回值
一个新字符串,它是此字符串的副本,所有孤立代理都被替换为 Unicode 替换字符 U+FFFD。如果 str
格式正确,则仍然返回一个新字符串(本质上是 str
的副本)。
描述
JavaScript 中的字符串是 UTF-16 编码的。UTF-16 编码具有代理对的概念,这在 UTF-16 字符、Unicode 代码点和音节簇 部分中详细介绍。
toWellFormed()
遍历此字符串的代码单元,并将任何孤立代理替换为 Unicode 替换字符 U+FFFD �
。这确保返回的字符串格式正确,并且可以在预期格式正确字符串的函数中使用,例如 encodeURI
。与自定义实现相比,toWellFormed()
更有效率,因为引擎可以直接访问字符串的内部表示。
当在某些上下文中使用格式错误的字符串时,例如 TextEncoder
,它们会自动使用相同的替换字符转换为格式正确的字符串。当渲染孤立代理时,它们也渲染为替换字符(内部带问号的菱形)。
示例
使用 toWellFormed()
js
const strings = [
// Lone leading surrogate
"ab\uD800",
"ab\uD800c",
// Lone trailing surrogate
"\uDFFFab",
"c\uDFFFab",
// Well-formed
"abc",
"ab\uD83D\uDE04c",
];
for (const str of strings) {
console.log(str.toWellFormed());
}
// Logs:
// "ab�"
// "ab�c"
// "�ab"
// "c�ab"
// "abc"
// "ab😄c"
避免 encodeURI() 中的错误
encodeURI
如果传递的字符串格式不正确,则会抛出错误。这可以通过先使用 toWellFormed()
将字符串转换为格式正确的字符串来避免。
js
const illFormed = "https://example.com/search?q=\uD800";
try {
encodeURI(illFormed);
} catch (e) {
console.log(e); // URIError: URI malformed
}
console.log(encodeURI(illFormed.toWellFormed())); // "https://example.com/search?q=%EF%BF%BD"
规范
规范 |
---|
ECMAScript 语言规范 # sec-string.prototype.towellformed |
浏览器兼容性
BCD 表格仅在浏览器中加载