2010-04-02 55 views
2

我正在寻找一种简单高效的方式来存储ASCII-7中的UTF-8字符串。凭借高效的我指的是以下几点:ASCII编码的有效方法UTF-8

  • 所有输入ASCII字母数字字符应保持相同的ASCII字母数字字符输出
  • 生成的字符串应该是尽可能短
  • 操作必须可逆式没有任何数据丢失
  • 所得ASCII字符串应不区分大小写
  • 应该有对输入长度
  • 没有限制整个UTF-8范围应当allowe d

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

任何人都可以推荐一种替代编码方案吗?更好的是,如果有一些代码可供查看。

+0

你是什么意思通过“输入中的所有ASCII字符都应该在输出中保留ASCII字符”?你在问什么是7位编码? – 2010-04-02 15:16:09

+0

我更新了第一点,以便更清楚。我也忘了提及,我希望有大小写不敏感的输出,似乎排除UTF-7。 – 2010-04-02 15:38:46

+0

当你说“生成的ASCII字符串应该不区分大小写”你是什么意思?字符串只是字符串,它们不区分大小写或不敏感。你的意思是它应该全部小写吗?全部大写? – 2010-04-02 16:03:32

回答

4

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

输入所有ASCII字符应留ASCII字符输出

(显然不是完全可能的,因为你需要至少一个字符作为一种逃避。)

+0

您正在阅读的要求是,输入中的ASCII字符在输出中保持为*相同的* ASCII字符。这可能是他的意图(在这种情况下,你显然是正确的),但这不是他实际上所说的 - 并且符合所述要求的编码当然是可能的。 – 2010-04-02 15:16:54

+0

heh。是的,我的意思是ASCII字符应该保持相同的字符。 UTF-7看起来很不错。感谢提示。 – 2010-04-02 15:28:47

+0

@Andreas Gohr - UTF-7不保留修改后的ASCII范围。 – 2010-04-02 15:37:50

2

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

编辑补充:

我想我明白你的要求了。您正在寻找一种方法来编码UTF-8字符串的七位代码,其中,如果该编码的字符串被解释为ASCII文本,则字母字符的情况可以任意修改,但解码后的字符串将会与原始字节相同。

如果是这样的话,那么你最好的选择可能就是将原始的二进制表示编码为一串十六进制数字。我知道你正在寻找更紧凑的表示形式,但考虑到系统的其他限制,这是一个非常高的顺序,除非设计了一些自定义编码。

由于十六进制表示法可以对任意二进制值进行编码,因此可以在采用十六进制值之前压缩字符串来缩小字符串。

0

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

0

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

Quoted-printable对于大多数ASCII字符串是很好的,因为除了'='和控制字符之外没有开销。但是,非ASCII字符每个都需要6-12个字节,所以如果您有很多这些字符,则需要考虑使用UTF-7或Base64。

1

如果你谈论的是非标准方案 - MECE

0

的Punycode用于IDNA,但您可以使用它通过它施加的限制外

本身的Punycode不会失败的最后2个要求:

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

(对于IDNA,蟒蛇用品另一个同名编码)

很明显,如果你不姓准备输入,编码的字符串不是严格不区分大小写的......但是如果你只提供小写字母(或者如果你不关心解码的情况)你应该很好去