René's URL Explorer Experiment


Title: TextDecoder is wrong and very slow · Issue #61041 · nodejs/node · GitHub

Open Graph Title: TextDecoder is wrong and very slow · Issue #61041 · nodejs/node

X Title: TextDecoder is wrong and very slow · Issue #61041 · nodejs/node

Description: Correctness Encodings that return invalid results: Single-byte: ibm866 (fails at even ascii input) koi8-u windows-874 windows-1252 windows-1253 windows-1255 Multi-byte (all except gb18030): gbk (should be identical to gb18030 but it is i...

Open Graph Description: Correctness Encodings that return invalid results: Single-byte: ibm866 (fails at even ascii input) koi8-u windows-874 windows-1252 windows-1253 windows-1255 Multi-byte (all except gb18030): gbk (sh...

X Description: Correctness Encodings that return invalid results: Single-byte: ibm866 (fails at even ascii input) koi8-u windows-874 windows-1252 windows-1253 windows-1255 Multi-byte (all except gb18030): gbk (sh...

Opengraph URL: https://github.com/nodejs/node/issues/61041

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"TextDecoder is wrong and very slow","articleBody":"## Correctness\n\nEncodings that return invalid results:\n * Single-byte:\n    * `ibm866` (fails at even ascii input)\n    * `koi8-u`\n    * `windows-874`\n    * `windows-1252`\n    * `windows-1253`\n    * `windows-1255`\n * Multi-byte (all except `gb18030`):\n   * `gbk` (should be identical to `gb18030` but it is instead broken)\n   * `big5`\n   * `euc-jp`\n   * `iso-2022-jp`\n   * `shift_jis` (fails at even ascii input)\n   * `euc-kr`\n\nUnimplemented encodings that throw:\n   * `iso-8859-16`\n   * `x-user-defined`\n\n\nIf built without `icu`, `utf-16le` encoding also returns invalid results:\n```js\n\u003e new TextDecoder('utf-16le').decode(Uint16Array.of(0xd800))\n'�' // correct\n'\\ud800' // no ICU\n```\n\n## Performance\n\n* `utf-8` (aka default) `TextDecoder` is much slower on ascii input than it can and should be\n   `1.3x` on 4096 bytes, `~3x` on 1 MiB input\n*  The above applies to `buffer.toString()` too\n   It's much slower on ASCII input than a checked js impl (same `1.3x`-`3x`)\n*  `windows-1252` aka `new TextDecoder('ascii')` aka `new TextDecoder('latin1')`\n    is ~`2x-4x` slower than an optimized impl on ascii input\n* `windows-1252` aka `new TextDecoder('latin1')`\n   is ~`6x-12x` slower than an optimized impl on latin1 input\n* `windows-1252` is ~`7x-12x` slower than an optimized js impl\n* Other single-byte encodings that are significantly slower than js impl even on non-ascii input:\n   `iso-8859-3`, `iso-8859-6`, `iso-8859-7`, `iso-8859-8`, `iso-8859-8-i`, `windows-1253`, `windows-1255`, `windows-1257`\n* None of the single-byte encodings are _faster_ than the js impl even on non-ascii input\n* All of the single-byte encodings except `windows-1252` are `\u003e=10x` slower than the js impl on ascii input\n  (`windows-1252` is _only_ ~`2-4x` slower)\n\n## References\n\nNothing of the above requires any changes on the native side, I compared to a somewhat optimized JS implementation\n\nSee https://docs.google.com/spreadsheets/d/1pdEefRG6r9fZy61WHGz0TKSt8cO4ISWqlpBN5KntIvQ/edit\n\nSee tests in https://github.com/ExodusOSS/bytes/blob/master/tests/encoding/mistakes.test.js (comment out the import and it can be run on Node.js without deps with only that file)\n\n## Suggestions\n\n1. Add a proper ASCII fast path to `buffer.toString()`\n   https://github.com/nodejs/node/pull/61119\n2. Add a proper ASCII fast path to `new TextDecoder().decode(arg)`\n   https://github.com/nodejs/node/pull/61119\n3. Perhaps replace single-byte decoders with a js impl, remove native paths and lib usage.   They all are just mappers, the implementation for all of them is identical\n   Or at least replace the slow, unsupported, or invalid ones.\n   #61093 \n4. Remove `gbk` decoder path and make it do the same as `gb18030` as the spec says\n    https://github.com/nodejs/node/pull/61099\n5. For utf16 decode optimistically using existing fast apis, then check the string for validity\n    https://github.com/nodejs/node/pull/61559\n6. Fix bugs in the non-ICU codepath\n    https://github.com/nodejs/node/pull/61409\n    https://github.com/nodejs/node/pull/61549\n    https://github.com/nodejs/node/pull/61559\n7. Fix or replace implementations for `big5`, `euc-jp`, `iso-2022-jp`, `shift_jis`, `euc-kr`\n    To fix legacy multi-byte decoders, attempt to re-use what Chromium has or import js code from `@exodus/bytes`\n","author":{"url":"https://github.com/ChALkeR","@type":"Person","name":"ChALkeR"},"datePublished":"2025-12-13T05:32:02.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":12},"url":"https://github.com/61041/node/issues/61041"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:b4daa4f6-87fa-3ef2-f8a7-6327127ee481
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idBB50:202FD4:CBD345:10ED37F:6A4C468E
html-safe-nonce3fff00642d6f70235b20f9783f6d2cfd8b66d525df4637a3bfb48fec2de69778
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQjUwOjIwMkZENDpDQkQzNDU6MTBFRDM3Rjo2QTRDNDY4RSIsInZpc2l0b3JfaWQiOiI5MDY3NTk0NTExMTE1MTEwMDMwIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac727173163e6acd5ba93a7f05e5fad92d65b92fb908899effe5fb513bde2e78a7
hovercard-subject-tagissue:3725526416
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/61041/issue_layout
twitter:imagehttps://opengraph.githubassets.com/747b2c431a84826cb858b6a4a9f9ff54af00622f0096a51ca9419bc1ebc70576/nodejs/node/issues/61041
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/747b2c431a84826cb858b6a4a9f9ff54af00622f0096a51ca9419bc1ebc70576/nodejs/node/issues/61041
og:image:altCorrectness Encodings that return invalid results: Single-byte: ibm866 (fails at even ascii input) koi8-u windows-874 windows-1252 windows-1253 windows-1255 Multi-byte (all except gb18030): gbk (sh...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameChALkeR
hostnamegithub.com
expected-hostnamegithub.com
None3d11bb817438277de2a940854450e83a7d32b6aeb5014e9e6b00a6423900251c
turbo-cache-controlno-preview
go-importgithub.com/nodejs/node git https://github.com/nodejs/node.git
octolytics-dimension-user_id9950313
octolytics-dimension-user_loginnodejs
octolytics-dimension-repository_id27193779
octolytics-dimension-repository_nwonodejs/node
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id27193779
octolytics-dimension-repository_network_root_nwonodejs/node
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release3996b3b83990e134be6c099ab9a7f48f140ae80f
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/nodejs/node/issues/61041#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F61041
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fissues%2F61041
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=nodejs%2Fnode
Reloadhttps://github.com/nodejs/node/issues/61041
Reloadhttps://github.com/nodejs/node/issues/61041
Reloadhttps://github.com/nodejs/node/issues/61041
Please reload this pagehttps://github.com/nodejs/node/issues/61041
nodejs https://github.com/nodejs
nodehttps://github.com/nodejs/node
Please reload this pagehttps://github.com/nodejs/node/issues/61041
Notifications https://github.com/login?return_to=%2Fnodejs%2Fnode
Fork 36k https://github.com/login?return_to=%2Fnodejs%2Fnode
Star 118k https://github.com/login?return_to=%2Fnodejs%2Fnode
Code https://github.com/nodejs/node
Issues 1.4k https://github.com/nodejs/node/issues
Pull requests 967 https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality 0 https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
Code https://github.com/nodejs/node
Issues https://github.com/nodejs/node/issues
Pull requests https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
TextDecoder is wrong and very slowhttps://github.com/nodejs/node/issues/61041#top
performanceIssues and PRs related to the performance of Node.js.https://github.com/nodejs/node/issues?q=state%3Aopen%20label%3A%22performance%22
https://github.com/ChALkeR
ChALkeRhttps://github.com/ChALkeR
on Dec 13, 2025https://github.com/nodejs/node/issues/61041#issue-3725526416
https://docs.google.com/spreadsheets/d/1pdEefRG6r9fZy61WHGz0TKSt8cO4ISWqlpBN5KntIvQ/edithttps://docs.google.com/spreadsheets/d/1pdEefRG6r9fZy61WHGz0TKSt8cO4ISWqlpBN5KntIvQ/edit
https://github.com/ExodusOSS/bytes/blob/master/tests/encoding/mistakes.test.jshttps://github.com/ExodusOSS/bytes/blob/master/tests/encoding/mistakes.test.js
src: improve StringBytes::Encode perf on ASCII #61119https://github.com/nodejs/node/pull/61119
src: improve StringBytes::Encode perf on ASCII #61119https://github.com/nodejs/node/pull/61119
lib: implement all 1-byte encodings in js #61093https://github.com/nodejs/node/pull/61093
lib: gbk decoder is gb18030 decoder per spec #61099https://github.com/nodejs/node/pull/61099
lib: add utf16 fast path for TextDecoder #61559https://github.com/nodejs/node/pull/61559
lib: unify ICU and no-ICU TextDecoder #61409https://github.com/nodejs/node/pull/61409
lib: use utf8 fast path for streaming TextDecoder #61549https://github.com/nodejs/node/pull/61549
lib: add utf16 fast path for TextDecoder #61559https://github.com/nodejs/node/pull/61559
performanceIssues and PRs related to the performance of Node.js.https://github.com/nodejs/node/issues?q=state%3Aopen%20label%3A%22performance%22
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.