将任意Java字符串转换为有限的字符集并将其转换回来的最佳方法是什么?
我想从任意Java String生成一个ETag,然后能够在随后呈现该ETag时重现原始String。
它们之间的etagc = %x21 / %x23-7E / obs-text
; VCHAR except double quotes, plus obs-text
obs-text = %x80-FF
松散地,这意味着任何大于或等于0x21
的8位字符,0x22
和0x7f
除外。鉴于Java字符串可以包含任何Unicode字符,ETag中不允许有很多字符串。
简单地说,因为0 - 9和A - F都是有效的ETag字符,我可以:
反转此代码的代码有点痛苦,但 是完全可逆的,它适用于所有Java字符串。
然而,我的简化方法会产生很长的ETag,效率很低,可能会在实践中引起问题。
如何通过利用我可以使用220个字符的事实来制作更短的ETag?有这个目的的图书馆吗?
答案 0 :(得分:0)
我认为没有"基地220"可用的编码/解码库符合您的规范。 (尽管如此,您可能需要查看Furcadia Base 220 Encoding来编码固定长度的数据块。)您可以使用Base 91做得比Base 64更好(请参阅here和更新版本{{3 }})。
如果您想尽可能多地使用220个字符,那么您必须自己动手。 Base 64或Base 91代码是很好的起点。 (特别是分析它们之间的差异会让你知道如何到达220.)因为你必须处理任意输入长度,你不应该期望能够充分利用220个字符的编码数据。您需要保留一些字符来控制信号,填充等,或者将其他数据注入编码流中以指示字符串长度。
答案 1 :(得分:0)
如果您的字符串主要是ASCII,请实现已修改 UTF-8 (变体,但不要与MUTF-8混淆),修改的地方math.cos(math.radians(45))
- 0x00
,0x20
和0x22
都以2个字节编码。
这很有效,因为根据您引用的规范,多字节UTF-8序列仅使用0x7f
- 0x80
,它们在ETag中都是有效的。
示例: Java字符串0xff
,即文本"Test \"\u20AC\""
,将编码为字节Test "€"
,将显示在ISO-8859-1中作为54 65 73 74 c0 81 c2 81 e2 82 ac c2 81
,在Windows-1252中作为TestÀÂâ¬Â
。
但是,在HTTP标头中使用字节TestÀ�Â�€Â�
- 0x80
可能会造成麻烦(例如,请参阅上面的字节0xff
和81
的文本显示),因此&#39如果可能的话,最好避免它们。
如果您只使用标准的Base64编码,则可以。您当然首先必须将文本编码为字节。如果您的字符串主要是ASCII,请使用UTF-8,否则只需直接使用2字节82
值,即使用UTF-16。
示例:使用与上面相同的Java字符串,它将编码为char
,它由纯有效的ASCII字符组成。
在Java 8中,这很容易做到:
VGVzdCAi4oKsIg==