Baseline Widely available
TextEncoder.encodeInto()
æ¹æ³æ¥åä¸ä¸ªè¦ç¼ç çå符串åä¸ä¸ªç®æ Uint8Array
ï¼å°çæç UTF-8 ç¼ç çææ¬æ¾å
¥ç®æ æ°ç»ä¸ï¼å¹¶è¿åä¸ä¸ªæç¤ºç¼ç è¿åº¦çåå
¸å¯¹è±¡ãè¿ç¸æ¯äºæ§ç encode()
æ¹æ³æ§è½æ´é«ââå°¤å
¶æ¯å½ç®æ ç¼å²åºæ¯ WASM å è§å¾æ¶ã
encodeInto(string, uint8Array)
åæ°
string
ä¸ä¸ªå符串ï¼å å«å°è¦ç¼ç çææ¬ã
uint8Array
ä¸ä¸ª Uint8Array
对象å®ä¾ï¼ç¨äºå°çæç UTF-8 ç¼ç çææ¬æ¾å
¥å
¶ä¸ã
ä¸ä¸ªå¯¹è±¡ï¼å å«ä¸¤ä¸ªåæ°ã
read
å·²ç»ä»æºå符串ä¸è½¬æ¢ä¸º UTF-8 çï¼ä½¿ç¨ UTF-16 ç¼ç çç å
æ°ã妿 uint8Array
没æè¶³å¤ç空é´ï¼åæ¤å¼å¯è½å°äº string.length
ã
written
å¨ç®æ Uint8Array
ä¸ä¿®æ¹çåèæ°ãåå
¥çåèç¡®ä¿å½¢æå®æ´ç UTF-8 åèåºåã
encoder.encodeInto()
æ»æ¯å°å®è¾åºçç»ææ¾å¨æ°ç»çå¼å¤´ãç¶èï¼ææ¶ä½¿è¾åºä»ä¸ä¸ªæå®çç´¢å¼å¼å§å¾æç¨ãè§£å³æ¹æ¡æ¯ï¼TypedArray.prototype.subarray()
ï¼
const encoder = new TextEncoder();
function encodeIntoAtPosition(string, u8array, position) {
return encoder.encodeInto(
string,
position ? u8array.subarray(position | 0) : u8array,
);
}
const u8array = new Uint8Array(8);
encodeIntoAtPosition("hello", u8array, 2);
console.log(u8array.join()); // 0,0,104,101,108,108,111,0
ç¼å²åºå¤§å°
转æ¢ä¸ä¸ª JavaScript å符串 s
å° UTF-8 åºåæ¶ï¼å®å
¨è½¬æ¢è¾åºæéç空é´ä»ä¸ä¼å°äº s.length
个åèï¼ä¹ä»ä¸ä¼å¤§äº s.length * 3
åèã妿é¢è®¡è¾åºå°ç¼å²åºï¼é常æ¯å¨ WASM å ä¸ï¼ççå½å¨æå¾çï¼åå¯ä»¥ä¸ºè¾åºåé
s.length * 3
åèç空é´ï¼è¿æ ·å°±è½ä¿è¯å¨ç¬¬ä¸æ¬¡å°è¯ä¸è½¬æ¢æ´ä¸ªåç¬¦ä¸²ãæ³¨æï¼s.length * 3
çæ
嵿¯å¾å°è§çï¼å 为å¾å°æå符串ä¸ä¸å®å
嫿©å±ä¹å为 3 个åèçå符ãé¿ææ¬çé¿åº¦å°ä¸å¤ªå¯è½è¶
è¿ s.length * 2
个åèãå æ¤ï¼æ´ä¹è§çæ¹æ³å¯è½æ¯åé
s.length * 2 + 5
个åèç空é´ï¼å¹¶ä¸å¨æå°æ°çæ
åµä¸ï¼ä¹è§åé
çæ¹æ³åºç°é误ï¼è¿è¡éæ°åé
ã
妿é¢è®¡è¾åºççå½å¨æå¾é¿ï¼åå¯ä»¥è®¡ç®æå°åé
空é´ä¸º roundUpToBucketSize(s.length)
ï¼æå¤§åé
空é´ä¸º s.length * 3
ï¼å¹¶ä¸éæ©ä¸ä¸ªéå¼ t
ï¼ä½ä¸ºå
å使ç¨åé度ä¹é´çæè¡·æ¹æ¡ï¼ï¼ä½¿å¾ roundUpToBucketSize(s.length) + t >= s.length * 3
æ¶ï¼åé
s.length * 3
ç空é´ãå¦åï¼é¦å
为 roundUpToBucketSize(s.length)
åé
空é´å¹¶è¿è¡è½¬æ¢ã妿è¿åçåå
¸å¯¹è±¡ä¸ç read
ç大å°ä¸º s.length
ï¼å表示转æ¢å®æã妿䏿¯ï¼å°ç®æ çç¼å²åºç大å°éæ°åé
为 written + (s.length - read) * 3
ï¼å¹¶ä»å符串 s
ä¸çç´¢å¼ read
å¤å¼å§ååå符串ï¼å¹¶ä»ç®æ ç¼å²åºçç´¢å¼ written
å¤å¼å§ååç¼å²åºè¿è¡è½¬æ¢ã
ä¸è¿° roundUpToBucketSize()
彿°ï¼ç¨äºå°ç©ºé´åä¸èå
¥å°åé
å¨ç桶大å°ãä¾å¦ï¼å¦æä½ ç Wasm åé
å¨ä½¿ç¨ 2 ç广¬¡æ¹æ¡¶ï¼å roundUpToBucketSize()
åºè¯¥è¿åè¯¥åæ°ï¼å¦æå®æ¯ 2 ç广¬¡æ¹çè¯ï¼å¦åè¿åä¸ä¸ä¸ª 2 ç广¬¡æ¹ï¼ã妿 Wasm åé
å¨çè¡ä¸ºæªç¥ï¼å roundUpToBucketSize()
åºä¸ºæç彿°ã
å¦æä½ åé
å¨çè¡ä¸ºæªç¥ï¼ä½æ¯ä½ å¯è½æ³è¦è¿è¡å¤è¾¾ä¸¤æ¬¡éæ°åé
ï¼å¹¶ä½¿å¾ç¬¬ä¸æ¬¡éåé
çæ¥éª¤å°å©ä½æªè½¬æ¢çé¿åº¦ä¹ä»¥ 2 è䏿¯ 3ãç¶èï¼å¨è¿ç§æ
åµä¸ï¼å°å·²ç»åå
¥ç¼å²åºçé¿åº¦ä¹ä»¥ 2 éå¸¸æ¯æ²¡ææä¹çï¼å 为å¨è¿ç§æ
åµä¸ï¼å¦æåçç¬¬äºæ¬¡éåé
ï¼ä¸åå§é¿åº¦ä¹ 3 ç¸æ¯ï¼å®å°æ»æ¯è¿åº¦åé
ãä¸è¿°å»ºè®®åè®¾ä½ ä¸éè¦ä¸º 0 ç»æ¢ç¬¦åé
空é´ãä¹å°±æ¯è¯´ï¼å¨ WASM æ¹é¢ï¼ä½ æ£å¨ä½¿ç¨ Rust å符串æè
ä¸ä¸ªä¸ä»¥ 0 ç»æ¢ç C++ ç±»ãå¦æä½ æ£å¨ä½¿ç¨ C++ std::string
æ ååºï¼å³ä½¿é»è¾é¿åº¦å·²ç»åä½ å±ç¤ºï¼å½è®¡ç®åä¸èå
¥å°åé
å¨ç桶大å°çæ¶åï¼ä½ è¿æ¯éè¦å»èèé¢å¤çç»æ¢ç¬¦åèã请åé
ä¸ä¸èæå
³ C å符串çå
容ã
妿è¾å
¥å符串å¨è¾å
¥ä¸å
å«å符 U+0000ï¼encodeInto()
å°å¨è¾åºä¸åå
¥ä¸ä¸ª 0x00 åèãencodeInto()
ä¸ä¼å¨é»è¾è¾åºååå
¥ C 飿 ¼ç 0x00 æ è®°åèã
å¦æä½ ç Wasm ç¨åºä½¿ç¨ C å符串ï¼é£ä¹ä½ æèè´£å»å 0x00
çæ è®°ï¼å¹¶ä¸å¦æä½ ç JavaScript å符串å
å« U+0000
ï¼åæ æ³é»æ¢ Wasm ç¨åºçå°é»è¾æªæçå符串ãè§å¯ï¼
const encoder = new TextEncoder();
function encodeIntoWithSentinel(string, u8array, position) {
const stats = encoder.encodeInto(
string,
position ? u8array.subarray(position | 0) : u8array,
);
if (stats.written < u8array.length) u8array[stats.written] = 0; // append null if room
return stats;
}
示ä¾
<p class="source">This is a sample paragraph.</p>
<p class="result"></p>
const sourcePara = document.querySelector(".source");
const resultPara = document.querySelector(".result");
const string = sourcePara.textContent;
const textEncoder = new TextEncoder();
const utf8 = new Uint8Array(string.length);
const encodedResults = textEncoder.encodeInto(string, utf8);
resultPara.textContent +=
`Bytes read: ${encodedResults.read}` +
` | Bytes written: ${encodedResults.written}` +
` | Encoded result: ${utf8}`;
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4