我目前正在Android上开发一个营销应用,它具有通过短信发送网址的功能。因为我正在使用短信,我想使文本尽可能短,所以它不会被分成几部分。
该网址由应用动态生成。不同的联系人将导致不同的URL,因为应用程序将一些“联系人相关信息”放入URL。 此信息需要缩短,而不是基本网址。
我尝试使用 Base64 来缩短字符串,但它无效。
Before
Text: Myself|1234567890
Length: 17
After
Text: TXlzZWxmfDEyMzQ1Njc4OTA=
Length: 25
然后我尝试Deflater,结果优于 Base64 ,但仍然没有缩短字符串。
Before
Text: Myself|1234567890
Length: 17
After
Text: x��,N�I�1426153��4����3��
Length: 24
我也尝试了GZIP,结果比其他方法更糟糕。
Before
Text: Myself|1234567890
Length: 17
After
Text: ����������������,N�I�1426153��4�����w��������
Length: 36
在比较测试结果后,我决定使用 Base64 ,因为它有时会起作用,但我完全不满意。任何人都可以给我一个更好的方法吗?
修改
我需要离线执行此字符串缩短,无需连接互联网。对于这一突如其来的变化,我非常抱歉,因为我们的开发团队已经做出决定。有什么想法吗?
答案 0 :(得分:1)
它上面的Base64自己不会工作,因为它通常会将编码字符串的长度增加大约37%。
Deflater和GZIP都包含会增加短字符串长度的标题。
但是,您可以使用Huffman coding或Arithmetic coding来利用某些字符在网址中比其他字符更常见的事实。通过生成大约数千个字符串并对每个字符的出现进行求和来生成字符串的频率表,然后根据这些频率生成霍夫曼编码表。然后,您可以使用此硬编码表对字符串进行编码和解码:不要将表与消息一起传输。
Here is an interactive webpage允许您输入各种字符串并且Huffman对它们进行编码:您可以尝试使用您的网址来大致了解您可以预期的压缩率,但在实践中,您将得到一个如果您对所有字符串使用相同的表,则压缩率会略低一些。对于您的示例文本"我自己| 1234567890"霍夫曼编码字符串的大小是原始字符串的51%。
在您生成霍夫曼编码的字符串后,您可能需要对其进行另一次传递以逃避在SMS中无法传输的任何非法字符(或者只是Base64对您的霍夫曼编码字符串进行编码),这可能会否定您的霍夫曼编码有所节省,但希望你最终还是会节省净资金。
如果使用霍夫曼编码获得50%左右的压缩率,然后Base64对结果进行编码(再次增加大小),结果仍然会比原始结果小约30%。