String.prototype.toWellFormed()
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с октября 2023 года.
Метод toWellFormed() значений String возвращает строку, в которой все одиночные суррогаты этой строки заменены символом замены Unicode U+FFFD.
Синтаксис
toWellFormed()
Параметры
Нет.
Возвращаемое значение
Новая строка, которая является копией текущей строки, в которой все одиночные суррогаты заменены символом замены Unicode U+FFFD. Если str является правильно сформированной, новая строка все равно возвращается (по сути, копия str).
Описание
Строки в JavaScript кодируются в UTF-16. Кодирование UTF-16 использует концепцию суррогатных пар, которая подробно представлена в разделе Символы UTF-16, кодовые точки Unicode и кластеры графем.
toWellFormed() перебирает кодовые единицы этой строки и заменяет все одиночные суррогаты на символ замены Unicode U+FFFD �. Это гарантирует, что возвращаемая строка является правильно сформированной и может использоваться в функциях, которые ожидают правильно сформированные строки, таких как encodeURI. По сравнению с пользовательской реализацией, toWellFormed() более эффективен, поскольку движки могут напрямую обращаться к внутреннему представлению строк.
Когда неправильно сформированные строки используются в определенных контекстах, например, в TextEncoder, они автоматически преобразуются в правильно сформированные строки с использованием того же символа замены. Когда одиночные суррогаты отображаются, они также отображаются как символ замены (ромб с вопросительным знаком внутри).
Примеры
Использование toWellFormed()
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() для предварительного преобразования строки в правильно сформированную строку.
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"
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
toWellFormed |
111 |
111 |
119 |
97 |
16.4 |
111 |
119 |
75 |
16.4 |
22.0 |
111 |
16.4 |
1.0.0 |
1.32 |
20.0.0 |
Смотрите также
- Полифил
String.prototype.toWellFormedвcore-js - Полифил es-shims для
String.prototype.toWellFormed String.prototype.isWellFormed()String.prototype.normalize()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toWellFormed