Android - 字符串缩短方法
Android - String Shortening Approach
我目前正在 Android 上开发一个营销应用程序,它具有通过短信发送 URL 的功能。因为我正在使用 SMS,所以我想使文本尽可能短,这样它就不会被分成几部分。
URL由app动态生成。不同的联系人会导致不同的 URL,因为应用程序将一些 "contact related information" 放入 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,因为它有时可以,但我完全不满意。谁能给我一个更好的方法?
编辑:
我需要这个 String Shortening 离线执行,没有互联网连接。对于这种突然的变化,我感到非常抱歉,因为我们的开发团队是这样决定的。有什么想法吗?
Base64 本身不起作用,因为它通常会将编码字符串的长度增加大约 37%。
Deflater 和 GZIP 都包含 headers 会增加短字符串的长度。
但是,您可以使用 Huffman coding or Arithmetic coding 来利用以下事实:某些字符在 URL 中比其他字符更常见。通过生成大约一千个字符串并对每个字符的出现次数求和,为您的字符串生成频率 table,然后根据这些频率生成霍夫曼编码 table。然后您可以使用此 hard-coded table 来编码和解码您的字符串:不要将 table 与消息一起传输。
Here is an interactive webpage 允许您输入各种字符串并对它们进行霍夫曼编码:您可以尝试使用您的 URL 来大致了解您可以期望什么样的压缩率,但在实践中您会如果您对所有字符串使用相同的 table,则压缩率会略低。对于您的示例文本 "Myself|1234567890",霍夫曼编码字符串的大小是原始字符串的 51%。
生成霍夫曼编码字符串后,您可能需要再次传递它以转义无法在 SMS 中传输的任何非法字符(或仅对您的霍夫曼编码字符串进行 Base64 编码),这可能会否定您的从霍夫曼编码中节省了一些,但希望您最终仍会节省净额。
如果您使用霍夫曼编码获得 50% 左右的压缩率,然后对结果进行 Base64 编码(再次增加大小),您最终得到的结果仍然会比原始结果小 30% 左右。
我目前正在 Android 上开发一个营销应用程序,它具有通过短信发送 URL 的功能。因为我正在使用 SMS,所以我想使文本尽可能短,这样它就不会被分成几部分。
URL由app动态生成。不同的联系人会导致不同的 URL,因为应用程序将一些 "contact related information" 放入 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,因为它有时可以,但我完全不满意。谁能给我一个更好的方法?
编辑:
我需要这个 String Shortening 离线执行,没有互联网连接。对于这种突然的变化,我感到非常抱歉,因为我们的开发团队是这样决定的。有什么想法吗?
Base64 本身不起作用,因为它通常会将编码字符串的长度增加大约 37%。
Deflater 和 GZIP 都包含 headers 会增加短字符串的长度。
但是,您可以使用 Huffman coding or Arithmetic coding 来利用以下事实:某些字符在 URL 中比其他字符更常见。通过生成大约一千个字符串并对每个字符的出现次数求和,为您的字符串生成频率 table,然后根据这些频率生成霍夫曼编码 table。然后您可以使用此 hard-coded table 来编码和解码您的字符串:不要将 table 与消息一起传输。
Here is an interactive webpage 允许您输入各种字符串并对它们进行霍夫曼编码:您可以尝试使用您的 URL 来大致了解您可以期望什么样的压缩率,但在实践中您会如果您对所有字符串使用相同的 table,则压缩率会略低。对于您的示例文本 "Myself|1234567890",霍夫曼编码字符串的大小是原始字符串的 51%。
生成霍夫曼编码字符串后,您可能需要再次传递它以转义无法在 SMS 中传输的任何非法字符(或仅对您的霍夫曼编码字符串进行 Base64 编码),这可能会否定您的从霍夫曼编码中节省了一些,但希望您最终仍会节省净额。
如果您使用霍夫曼编码获得 50% 左右的压缩率,然后对结果进行 Base64 编码(再次增加大小),您最终得到的结果仍然会比原始结果小 30% 左右。