String.prototype.toWellFormed()

Baseline 2023
Newly available

Since October 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

Phương thức toWellFormed() của các giá trị String trả về một chuỗi trong đó tất cả các surrogate đơn lẻ của chuỗi này được thay thế bằng ký tự thay thế Unicode U+FFFD.

Cú pháp

js
toWellFormed()

Tham số

Không có.

Giá trị trả về

Một chuỗi mới là bản sao của chuỗi này, với tất cả các surrogate đơn lẻ được thay thế bằng ký tự thay thế Unicode U+FFFD. Nếu str có định dạng tốt, vẫn sẽ trả về một chuỗi mới (về bản chất là bản sao của str).

Mô tả

Chuỗi trong JavaScript được mã hóa UTF-16. Mã hóa UTF-16 có khái niệm surrogate pair, được giới thiệu chi tiết trong phần Ký tự UTF-16, code point Unicode và grapheme cluster.

toWellFormed() duyệt qua các đơn vị code của chuỗi này và thay thế mọi surrogate đơn lẻ bằng ký tự thay thế Unicode U+FFFD <0xFFFD>. Điều này đảm bảo chuỗi trả về có định dạng tốt và có thể được sử dụng trong các hàm yêu cầu chuỗi có định dạng tốt, chẳng hạn như encodeURI. So với cách triển khai tùy chỉnh, toWellFormed() hiệu quả hơn vì các engine có thể truy cập trực tiếp vào biểu diễn nội bộ của chuỗi.

Khi các chuỗi không có định dạng tốt được sử dụng trong một số ngữ cảnh nhất định, chẳng hạn như TextEncoder, chúng sẽ tự động được chuyển đổi thành chuỗi có định dạng tốt bằng cùng ký tự thay thế. Khi các surrogate đơn lẻ được hiển thị, chúng cũng được hiển thị dưới dạng ký tự thay thế (một hình thoi có dấu chấm hỏi bên trong).

Ví dụ

Sử dụng 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<0xFFFD>"
// "ab<0xFFFD>c"
// "<0xFFFD>ab"
// "c<0xFFFD>ab"
// "abc"
// "ab😄c"

Tránh lỗi trong encodeURI()

encodeURI ném ra lỗi nếu chuỗi được truyền vào không có định dạng tốt. Có thể tránh điều này bằng cách sử dụng toWellFormed() để chuyển đổi chuỗi thành chuỗi có định dạng tốt trước.

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"

Đặc tả kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-string.prototype.towellformed

Khả năng tương thích với trình duyệt

Xem thêm