String.prototype.toWellFormed()
åºçº¿
广æ³å¯ç¨
èª 2023å¹´10æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
String ç toWellFormed() æ¹æ³è¿åä¸ä¸ªå符串ï¼å
¶ä¸è¯¥åç¬¦ä¸²çææåç¬ä»£ç项é½è¢«æ¿æ¢ä¸º 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 = [
// åç¬çå导代ç
"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"
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-string.prototype.towellformed> |