【问题标题】:encode ASCII symbols into UTF-8 presentation将 ASCII 符号编码为 UTF-8 表示
【发布时间】:2021-11-17 08:23:51
【问题描述】:

我有一个字符串,我知道它现在肯定只有ASCII 字母。 JS 默认将字符串视为UTF-8, 所以这意味着每个字符最多占用4个字节, 这是 ASCII 的 4 倍。

我正在尝试压缩 / 节省空间 / 尽可能获得最短的字符串, 通过具有encodedecode 函数。

我想过在UTF-8 字符串上表示ASCII 的4 个字符,从而实现我的目标,有没有类似的东西?

如果不是,压缩ASCII 字符串的最佳方法是什么,以便通过编码和解码得到相同的字符串?

【问题讨论】:

    标签: javascript encoding utf-8 compression ascii


    【解决方案1】:

    如果你想每个字符使用 1 个字节,你可以简单地使用一个字节。已经有function 可以从字节转成字符串了。

    【讨论】:

      【解决方案2】:

      实际上,JavaScript 以 UTF-16 编码程序字符串,它使用 2 个八位字节(16 位)用于 BMP(基本多语言平面)中的 Unicode 字符,并使用 4 个八位字节(32 位)用于其外部的字符。所以至少在内部,ASCII 字符使用 2 个字节。

      有空间将两个 ASCII 字符打包成 16 位,因为它们每个只使用 7 位。此外,由于2**162**14之间的区别是49152,而UTF-16中代理对使用的编码数量是(allegedly)2048,你应该能够设计一个编码方案这避免了代理使用的代码点范围。

      您还可以使用 8 位 typed arrays 来保存 ASCII 字符,同时避免自定义压缩算法的复杂性。

      如今,压缩 7 位 ASCII 以在 JavaScript 中使用的目的在很大程度上(完全?)是学术性的,而不是有需求的东西。请注意,由于 UTF-8 的设计,将 7 位 ASCII 内容编码为 UTF-8(用于传输或文件编码)仅使用一个字节用于 ASCII 字符。

      【讨论】:

      • 两个注意事项:“UTF-16”是一种简化:JS有重复字符串函数,旧UCS-2和新UTF-16之一(你可能会发现:“code-unit”和“代码点”来使“显式”哪个解释正在使用 JS(针对特定功能)。注意二:内部 JS 可能使用更优化的类型(但透明地)。
      • @GiacomoCatenazzi Unicode Glossary 涵盖了代码点和单位之间的差异。 JavaScript 是为 UCS-2 编写的,这解释了为什么 String.prototype 方法(如 charAtcharCodeAt 与代码单元一起使用,而 string.length 返回字符串中代码单元的数量而不是字符。 String.prototype.codePointAt 方法是将 UCS-2 扩展到 UTF-16 字符串编码的一部分,但该方法的参数是代码单元。我怀疑 JavaScript 优化是否会改变字符串代码单元的 16 位大小。
      • 我不知道优化,但是 Python 做的(而且 Python 没有 JS 优化得那么厉害,两者都交换了实现思路)。
      猜你喜欢
      • 2011-06-26
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2014-06-19
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多