`TextEncoder.encodeInto()` underfills the destination for some non-ASCII text
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 84/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- cpp, javascript, nodejs
Piste de recherche
Commencez dans src/encoding_binding.cc, en particulier avec simpleUtfEncodingLength() et findBestFit(), puis examinez la couverture WPT dans encodeInto.any.js. Reproduisez les exemples de 33 caractères et ajoutez une couverture pour U+0400–U+07FF ainsi que pour les destinations étroites ; le travail est terminé lorsque encodeInto indique les valeurs lues/écrites attendues et que les tests WPT concernés passent.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
There are two problems I found with TextEncoder.encodeInto(), both of which can cause encoding to stall even when the next char can fit the destination.
-
A 2-byte char requires a 3-byte destination
const encoder = new TextEncoder(); const text = '\u0400'.repeat(33); console.log(encoder.encodeInto(text, new Uint8Array(2))); // { read: 0, written: 0 } console.log(encoder.encodeInto(text, new Uint8Array(3))); // { read: 1, written: 2 }The second call proves that '\u0400' should fit into a 2-byte array.
-
Appending an unread character changes encoding progress
const encoder = new TextEncoder(); const text = 'é'.repeat(33); console.log(encoder.encodeInto(text, new Uint8Array(2))); // { read: 0, written: 0 } console.log(encoder.encodeInto(text + '☺', new Uint8Array(2))); // { read: 1, written: 2 }Appending
☺should not change whether preceding chars can be read into the buffer, but there it is.
The bugs were introduced by the encodeInto() performance change in Node.js v25.4.0. The examples above use length 33 strings to exercise that optimized path(kSmallStringThreshold = 32). Unfortunately the current encodeInto.any.js WPT tests fail to expose the problems because:
- all input cases use 7 or fewer code units
- even then, the cases don't use chars between U+0400 and U+07FF, and
- their cases don't contain a narrow dst capacity to reveal the signed-byte problem.
Proposed fixes
-
Incorrect cutoff in
simpleUtfEncodingLength()- if (c < 0x400) return 2; + if (c < 0x800) return 2;(very likely a typo, given the comment immediately below it says "Code points < 0x800: 2 bytes")
-
Signed-byte handling in
findBestFit()- size_t extra = simpleUtfEncodingLength(data[pos]); + size_t extra = simpleUtfEncodingLength(UTF16 ? data[pos] : static_cast<uint8_t>(data[pos]));
- Langage dominant
- JavaScript
- Étoiles
- 122k
- Forks
- 37.4k
- Merge moyen
- 4 j 3 h
- PR mergées (30 j)
- 272
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de nodejs/node
-
doc
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
-
build
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
-
feature request
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
stale
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Toutes les issues de nodejs/node
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
avniproject/avni-client#2135 ·
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
babalae/bettergi-scripts-list#3674 ·
-
A-Release-Notes C-Editing D-Modest S-Ready-For-Implementation
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
bevyengine/bevy-website#2595 ·
-
ecosystem wording
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
matrix-org/matrix.org#3649 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
vadimdemedes/ink#1029 ·