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.
구문
toWellFormed()
매개변수
없음.
반환 값
이 문자열의 복사본인 새 문자열로, 모든 론 서로게이트가 유니코드 대체 문자 U+FFFD로 대체됩니다. str
이 잘 형성된 문자열인 경우에도 새 문자열이 반환됩니다(기본적으로 str
의 복사본).
설명
JavaScript의 문자열은 UTF-16으로 인코딩됩니다. UTF-16 인코딩에는 서로게이트 쌍이라는 개념이 있으며, 이는 UTF-16 문자, 유니코드 코드 포인트 및 문자소 클러스터 섹션에 자세히 소개되어 있습니다.
toWellFormed()
는 이 문자열의 코드 단위를 반복하고 모든 론 서로게이트를 유니코드 대체 문자 U+FFFD �
로 대체합니다. 이렇게 하면 반환된 문자열이 올바른 형식의 문자열이 되어 encodeURI
와 같이 올바른 형식의 문자열을 기대하는 함수에서 사용할 수 있습니다. 사용자 정의 구현과 비교할 때 toWellFormed()
는 엔진이 문자열의 내부 표현에 직접 접근할 수 있으므로 더 효율적입니다.
잘못된 형식의 문자열이 TextEncoder
와 같은 특정 문맥에서 사용되는 경우 동일한 대체 문자를 사용하여 자동으로 올바른 형식의 문자열로 변환됩니다. 론 서로게이트가 렌더링될 때는 대체 문자(내부에 물음표가 있는 다이아몬드)로도 렌더링됩니다.
예제
toWellFormed() 사용하기
const strings = [
// 론 상위 서로게이트
"ab\uD800",
"ab\uD800c",
// 론 하위 서로게이트
"\uDFFFab",
"c\uDFFFab",
// 잘 형성된 문자열
"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"
명세서
Specification |
---|
ECMAScript Language Specification # sec-string.prototype.towellformed |
브라우저 호환성
BCD tables only load in the browser