2

我正在寻找一种简单有效的方法来将 UTF-8 字符串存储在 ASCII-7 中。高效我的意思是:

  • 输入中的所有 ASCII 字母数字字符应在输出中保持相同的 ASCII 字母数字字符
  • 结果字符串应尽可能短
  • 该操作需要是可逆的,不会丢失任何数据
  • 生成的 ASCII 字符串应该不区分大小写
  • 输入长度应该没有限制
  • 应该允许整个 UTF-8 范围

我的第一个想法是使用 Punycode (IDNA),因为它符合前四个要求,但在后两个方面失败了。

谁能推荐一种替代编码方案?如果有一些代码可供查看,那就更好了。

4

6 回答 6

4

UTF-7,或者,稍微不那么透明但更广泛的,quoted-printable

输入中的所有 ASCII 字符都应在输出中保留 ASCII 字符

(显然不完全可能,因为您至少需要一个角色来充当逃生角色。)

于 2010-04-02T15:02:31.373 回答
2

由于 ASCII 涵盖了 7 位值的全部范围,因此不可能保留所有 ASCII 字符、长度为 7 位并编码整个 Unicode 范围的编码方案。

编辑添加:

我想我现在明白你的要求了。您正在寻找一种将 UTF-8 字符串编码为 7 位代码的方法,其中,如果该编码字符串被解释为 ASCII 文本,那么字母字符的大小写可能会被任意修改,但解码后的字符串将逐个字节地与原始文件相同。

如果是这种情况,那么您最好的选择可能是将原始的二进制表示编码为十六进制数字字符串。我知道您正在寻找更紧凑的表示,但考虑到系统的其他约束,这是一个相当高的要求,除非设计了一些自定义编码。

由于十六进制表示可以对任意二进制值进行编码,因此可以通过在获取十六进制值之前压缩它们来缩小字符串。

于 2010-04-02T15:02:54.837 回答
1

如果您在谈论非标准方案 - MECE

于 2011-12-05T09:57:34.430 回答
0

URL 编码或数字字符引用是两个可能的选项。

于 2010-04-02T15:05:39.667 回答
0

这取决于字符串中字符的分布。

Quoted-printable 适用于大多数 ASCII 字符串,因为除了 '=' 和控制字符之外没有任何开销。但是,非 ASCII 字符每个占用 6-12 个字节的效率很低,因此如果您有很多这些字符,您将需要考虑使用 UTF-7 或 Base64。

于 2010-04-03T04:35:34.243 回答
0

Punycode 用于 IDNA,但您可以在其施加的限制之外使用它

就其本身而言,Punycode 不会满足您的最后两个要求:

>>> import sys
>>> _ = ("\U0010FFFF"*10000).encode("punycode")
>>> all(chr(c).encode("punycode") for c in range(sys.maxunicode))
True

(对于 idna,python 提供了另一种同名编码)

显然,如果你不命名输入,编码的字符串不再严格区分大小写......但如果你只提供小写(或者如果你不关心解码的大小写)你应该很好去

于 2013-05-02T17:33:49.907 回答