You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何维基百科称UTF-16已过时,但JavaScript仍在使用该编码?

为何维基百科称UTF-16已过时,但JavaScript仍在使用该编码?

这个问题确实戳中了一个很有意思的技术历史遗留矛盾,咱们一步步把它理清楚:

首先,维基百科说的“过时”是针对Web内容传输/存储编码场景

维基百科里的这段描述,核心是针对网页本身的编码格式:

UTF-16 is the only encoding (still) allowed on the web that is incompatible with 8-bit ASCII. However it has never gained popularity on the web, where it is declared by under 0.004% of public web pages (and even then, the web pages are most likely also using UTF-8). UTF-8, by comparison, gained dominance years ago and accounted for 99% of all web pages by 2025.

简单说,作为网页内容的编码格式,UTF-16确实已经被淘汰了:

  • 它不兼容ASCII,早期很多老系统处理起来容易出乱码;
  • 传输单字节字符(比如英文、数字)时会浪费一倍带宽;
  • 还有字节序(大端/小端)的问题,容易引发解析错误,甚至存在安全风险——这也是WHATWG明确要求浏览器不要用UTF-16处理网页内容的原因,同时把UTF-8定为所有文本的强制编码。

而JavaScript用UTF-16,是历史遗留的内存表示方案

这得追溯到JavaScript诞生的90年代中期:

  • 当时Unicode还处于早期阶段,UTF-8还没成为主流,行业里普遍用的是UCS-2(UTF-16的前身,固定用16位存储每个字符);
  • JS的字符串设计直接沿用了这个方案,把字符串表示为16位的字符单元序列,这个设计一直保留到现在,成为了语言的核心特性之一。

这里要划个重点:JS的UTF-16和Web上的内容编码完全是两回事:

  • 浏览器会先把UTF-8编码的网页内容(HTML、JS代码、文本内容)解析成内存中的UTF-16格式字符串,再执行JS逻辑或渲染页面;
  • 用户看到的网页是UTF-8传输的,但JS在内存里操作的是UTF-16的字符单元——两者各司其职,并不冲突。

补充:现代JS已经在弥补UTF-16的不足

虽然历史遗留了这个设计,但现代JS引擎做了很多优化:

  • 比如对ASCII字符会用单字节存储来节省内存,只是对外暴露的接口保持UTF-16的行为;
  • 还新增了codePointAt()、String.fromCodePoint()等方法,让开发者能更方便地处理Unicode中的辅助平面字符(那些需要用两个16位单元表示的字符)。

总结一下:维基百科说的“过时”是针对Web内容的传输编码场景,而JavaScript用UTF-16是语言历史遗留的内存表示方案,两者的应用场景完全不同,所以看似矛盾的现象其实是合理的技术演化结果。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:53:07