【问题标题】:How do I get an ASCII code from a string in JavaScript?如何从 JavaScript 中的字符串中获取 ASCII 码?
【发布时间】:2011-01-29 01:03:37
【问题描述】:

(类似的问题已经在 StackOverflow 上提出过,但不完全是这个。最近的可能是“javascript how to convert unicode string to ascii”,其中已经有“这必须是一个 dup[ licate]"。我已经阅读了一些类似的帖子,但他们没有回答我的具体问题。我查看了非常好的W3Schools 网站,并且还谷歌了它,但没有找到答案也是如此。因此,非常感谢这里的任何提示。)


我有一个字节数组被传递给一段 JavaScript。在 JavaScript 中,数据以字符串形式到达。我不知道传输机制,因为它来自第 3 方应用程序。我什至不知道字符串是“宽”还是“窄”。

在我的 JavaScript 中,我有一些类似 b = str.charCodeAt(pos); 的代码。

我的问题是 0x86 = 134 等字节值作为字符 0x2020 = 8224 传入。这似乎是因为我的原始字节被解释为拉丁语 1(可能)“匕首”字符,然后被转换为等效的 Unicode 代码点。 (问题可能是也可能不是 JavaScript 的“错误”。)其他值也会出现类似的问题,尽管范围 0x00..0x7F 和 0xA0..0xFF 似乎没问题,但 0x80..0x9F 中的大多数值都会受到影响,在每种情况下的值似乎都是原始 Latin-1 的 Unicode。

另一个观察结果是,如果长度以字节为单位,那么字符串的长度就是我对窄字符串的期望。 (另一方面,如果长度返回一个抽象字符的值,这并不能告诉我任何事情。)

那么,在 JavaScript 中,有没有办法获取字符串中的“原始”字节,或者直接获取 Latin-1 或 ASCII 字符代码,或者在字符编码之间进行转换,或者定义默认值编码?

我可以编写自己的映射,但我不想这样做。我希望这就是我最终会做的事情,但那感觉就像是一个杂物。

我还在研究调用应用程序中是否有什么可以调整的(因为它可以将数据作为宽字符串传递,尽管我对此表示怀疑)。

不过,无论哪种方式,我都会对是否有简单的 JavaScript 解决方案感兴趣,或者想了解为什么没有。

(如果传入的数据是字符数据,那么自动处理 Unicode 会很棒。但它不是,它只是一个二进制数据流。)

谢谢。

【问题讨论】:

  • Latin-1 中没有 DAGGER 字符。您可能指的是 Windows-1252。

标签: javascript unicode ascii character latin1


【解决方案1】:

字符串中没有原始字节这样的东西。 EcmaScript 规范将字符串定义为 UTF-16 代码单元序列。这是任何解释器所遇到的最细粒度的表示。

在浏览器上没有编码库。如果您尝试将字节数组表示为字符串并想要对其重新编码,则必须自己滚动。

如果您的字符串恰好是有效的 ASCII,那么您可以使用 charCodeAt 方法获取代码单元的数值。

"\n".charCodeAt(0) === 10

【讨论】:

  • 我接受片段“EcmaScript 规范将字符串定义为 UTF-16 代码单元序列”的答案。我暂时给自己写了一个哈希。我以后可能会找到更好的解决方案。谢谢。
【解决方案2】:

从 Javascript (Ecmascript) 规范开始:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf。是说:

8.4 字符串类型 String 类型是所有有限有序的集合 零个或多个 16 位无符号整数的序列 值(“元素”)。 String 类型一般是 用于表示正在运行的 ECMAScript 中的文本数据 程序,在这种情况下,字符串中的每个元素都是 视为代码单元值(见第 6 条)。每个 元素被认为占据了一个位置 序列。这些位置的索引与 非负整数。第一个元素(如果有)是 在位置 0,位置的下一个元素(如果有) 1,以此类推。 String 的长度是数字 其中的元素(即 16 位值)。这 空字符串的长度为零,因此包含 没有元素。

当一个字符串包含实际的文本数据时,每个 element 被认为是单个 UTF-16 代码单元。 这是否是实际的存储格式 字符串,字符串中的字符编号为 它们的初始代码单元元素位置,就好像它们 使用 UTF-16 表示。对字符串的所有操作 (除非另有说明)将它们视为 未区分的 16 位无符号整数;他们不 确保生成的字符串是规范化的形式,也不是 他们是否确保语言敏感的结果。

注意此设计背后的基本原理是保持 字符串的实现简单而高性能 尽可能。目的是文本数据进入 来自外部的执行环境(例如,用户输入, 从文件中读取或通过网络接收的文本等) 转换为 Unicode 规范化形式 C 之前 运行程序看到它。通常这会发生在 同时传入的文本从其原始转换 字符编码为 Unicode(并且不会强加额外的 高架)。既然推荐ECMAScript源码 代码采用规范化形式 C,保证字符串文字 被规范化(如果保证源文本是 标准化),只要它们不包含任何 Unicode 转义序列。

charCodeAt(p) 为您提供的是字符串中索引 p 处字符的 UTF-16 值(16 位数字)。由于 UTF-16 直接代表 Unicode 的基本多语言平面(即代码点 U+0000–U+D7FF 和 U+E000–U+FFFF,因此您的 Latin-1 字符应该是您期望的值。

事实上,它们并不是向我表明您对入站 3rd 八位字节流有编码问题 — 如果正在完成到 UTF-16 的转换并且入站八位字节流的编码错误,您会得到奇怪的结果。

也许它被视为普通 ASCII,而实际上它是 UTF-8(反之亦然)。 UTF-8 将 0x7F 以上的代码点表示为 2、3 或 4 八位字节的“二合字母”。

【讨论】:

  • 感谢您的信息。不过编码没有问题。这些值作为 Unicode 值非常有意义:这些值被合理地翻译;我只是不想让他们翻译。您的信息同样有用。
猜你喜欢
  • 2014-08-12
  • 2020-06-17
  • 1970-01-01
  • 2021-09-22
  • 2011-05-30
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多