JavaScript - 将字符串转换为UTF-16

3

我第一次使用JavaScript,并且是用于sha-1哈希。我已经找到了可以实现此功能的代码,但其中一个依赖项是将字符串转换为utf-8的方法,而我要与之比较的服务器使用的是utf-16。我已经搜索过了,但所有的结果都显示utf-8。请问有人能至少指点我正确的方向吗? 谢谢。

1个回答

8

Javascript已经在内部使用UTF-16 - 使用charCodeAt()来获取值。


注意:charCodeAt()不会给您UTF-16字节代码,它将为您提供无编码的Unicode代码点号,因此除非您还具有代码点到UTF16字节代码转换算法,否则它并不特别有用。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans:那是不正确的——charCodeAt()确实返回UTF-16代码单元——请参阅链接的文档或ECMA规范;您所描述的是codePointAt(),这是ES6的一个补充。 - Christoph
我经常阅读ECMA规范,这里是它的规范:“String.prototype.charCodeAt(pos) - 返回一个数字(小于2^16的非负整数),表示将此对象转换为字符串后在位置pos处的字符的代码单元值。如果该位置没有字符,则结果为NaN。” 代码单元指Unicode点,而不是特定的编码模式(Unicode本身是无编码的,它只是一个字形-X-has-list-number-...的列表)。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans:这里涉及到三个级别:(1)代码点(也称为Unicode字符),其值高达0x10FFFF(约21位),(2)ECMA规范所称的代码单元值,通过UTF-16编码Unicode字符获得,其中较高的代码点被编码为代理对(21>16),(3)字节级别,即决定以小端或大端顺序编码16位值的决策;ECMAScript5仅提供对第二级别的访问,但这很好,因为这正是SwiftStriker00所寻找的。 - Christoph
1
我正在测试字符过少的情况。"".charCodeAt()确实会给出代理字节值。抱歉。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans:别担心 - 没有人是完美的,这也基本上是SO的全部意义;我以前也曾经给出过错误的答案(虽然不多,但见上文)。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接