Encoding 对UTF-8进行ASCII编码的有效方法

Encoding 对UTF-8进行ASCII编码的有效方法,encoding,utf-8,ascii,punycode,Encoding,Utf 8,Ascii,Punycode,我正在寻找一种简单有效的方法,以ASCII-7格式存储UTF-8字符串。我的意思是: 输入中的所有ASCII字母数字字符应与输出中的ASCII字母数字字符保持一致 结果字符串应尽可能短 该操作需要在不丢失任何数据的情况下可恢复 生成的ASCII字符串应不区分大小写 输入长度不应有任何限制 应允许整个UTF-8范围 我的第一个想法是使用Punycode(IDNA),因为它符合前四个要求,但在后两个方面失败了 有人能推荐一种替代的编码方案吗?如果有一些代码可供查看,甚至更好。,或者,透明度稍低但

我正在寻找一种简单有效的方法,以ASCII-7格式存储UTF-8字符串。我的意思是:

  • 输入中的所有ASCII字母数字字符应与输出中的ASCII字母数字字符保持一致
  • 结果字符串应尽可能短
  • 该操作需要在不丢失任何数据的情况下可恢复
  • 生成的ASCII字符串应不区分大小写
  • 输入长度不应有任何限制
  • 应允许整个UTF-8范围
我的第一个想法是使用Punycode(IDNA),因为它符合前四个要求,但在后两个方面失败了

有人能推荐一种替代的编码方案吗?如果有一些代码可供查看,甚至更好。

,或者,透明度稍低但更广泛

输入中的所有ASCII字符应保持输出中的ASCII字符


(显然不完全可能,因为您至少需要一个字符作为转义。)

由于ASCII覆盖了7位值的整个范围,因此不可能使用保留所有ASCII字符、7位长且编码整个Unicode范围的编码方案

编辑以添加:

我想我现在明白你的要求了。您正在寻找一种在七位代码中对UTF-8字符串进行编码的方法,在这种方法中,如果编码的字符串被解释为ASCII文本,那么字母字符的大小写可能会被任意修改,但解码的字符串将与原始字符串完全相同

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


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

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

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


Quoted printable适用于大多数ASCII字符串,因为除了“=”和控制字符外,没有其他开销。但是,非ASCII字符每个都需要低6-12个字节,所以如果你有很多,那么你将要考虑UTF7或BASE64。

< P>如果你在谈论非标准方案——

< PyyCal码被用于IDNA,但是你可以在它所规定的限制之外使用它。 就其本身而言,Punycode不会满足您的最后两项要求:

>>> import sys
>>> _ = ("\U0010FFFF"*10000).encode("punycode")
>>> all(chr(c).encode("punycode") for c in range(sys.maxunicode))
True
(对于idna,python提供了另一种同名编码)


显然,如果不命名输入,编码的字符串不再严格区分大小写。。。但是,如果您只提供小写字母(或者如果您不关心已解码的大小写),您应该很乐意去

您所说的“输入中的所有ASCII字符都应该保持输出中的ASCII字符”是什么意思?你要求的是7位编码吗?我更新了第一点,让它更清楚。我还忘了提到我想要不区分大小写的输出,这似乎排除了UTF-7。当你说“生成的ASCII字符串应该不区分大小写”是什么意思?字符串只是字符串,它们不区分大小写或不区分大小写。你的意思是它应该都是小写的吗?都是大写的吗?箱子什么时候坏了都没关系。当编码字符串包含大写字母时,get的小写解码仍应保持相同的输入字符串。这当然不会影响输入中保持不变的字母,这些字母总是小写的。例如,在punycode xn--bcher-kva与xn--bcher-kva相同。那么您的意思是,如果字符串存储机制修改了编码字符串的大小写,那么得到的解码字符串仍然是与源字符串相同的字节对字节?所以您不在乎源代码中的ASCII字母数字字符是否在编码字符串中保留ASCII字母数字字符?重要的只是解码的字符串?您在阅读需求时说输入中的ASCII字符与输出中的ASCII字符相同。这可能是他想要的(在这种情况下,你显然是正确的),但这不是他实际说的——而且符合所述要求的编码当然是可能的。呵呵。是的,我的意思是ASCII字符应该保持不变。UTF-7看起来是一个很好的候选者。谢谢您的提示。@Andreas Gohr-UTF-7没有保留修改后的ASCII范围。UTF-7似乎区分大小写,我希望避免。