【问题标题】:Android - String Shortening ApproachAndroid - 字符串缩短方法
【发布时间】:2015-01-16 07:40:08
【问题描述】:

我目前正在 Android 上开发一个营销应用程序,该应用程序具有通过 SMS 发送 URL 的功能。因为我使用的是 SMS,所以我想使文本尽可能短,这样就不会被分成几部分。

网址由应用动态生成。不同的联系人会导致不同的 URL,因为应用程序会将一些“联系人相关信息”放到 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,因为它有时有效,但我完全不满意。谁能给我一个更好的方法?

编辑:

我需要在没有互联网连接的情况下离线执行此 字符串缩短。对于这种突然的变化,我感到非常抱歉,因为我们的开发团队如此决定。有什么想法吗?

【问题讨论】:

  • 字符串缩短方法意味着你只想以编码形式缩短文本??
  • 最后两种方法会有开销,这将始终包含在最终结果中。但是,这些方法仅在您压缩大量字符串数据时才有用。对于较小的数量(如您的示例中),最好不要使用它们。
  • @Ando:是的,一个更短的编码版本。你有什么想法吗?
  • 你为什么不使用 bit.ly 来创建缩短 url。参考它的 API dev.bitly.com
  • 您也可以使用 Google Url sortner API developers.google.com/url-shortenerstackoverflow.com/questions/18372672/… 是相同的 SO 条目。

标签: java android string sms


【解决方案1】:

Base64 本身不起作用,因为它通常会将编码字符串的长度增加大约 37%

Deflater 和 GZIP 都包含会增加短字符串长度的标头。

但是,您可以使用 Huffman codingArithmetic coding 来利用 URL 中某些字符比其他字符更常见的事实。通过生成大约一千个字符串并对每个字符的出现求和来为您的字符串生成频率表,然后根据这些频率生成霍夫曼编码表。然后,您可以使用此硬编码表对字符串进行编码和解码:不要将表与消息一起传输。

Here is an interactive webpage 允许您输入各种字符串并对其进行 Huffman 编码:您可以使用您的 URL 进行尝试,以大致了解您可以预期的压缩率,但实际上您会得到略低的压缩率如果您对所有字符串使用同一个表,则压缩率。对于您的示例文本“Myself|1234567890”,霍夫曼编码字符串的大小是原始字符串的 51%。

生成 Huffman 编码字符串后,您可能需要对其进行另一次传递,以逃避任何无法在 SMS 中传输的非法字符(或仅对您的 Huffman 编码字符串进行 Base64 编码),这可能会抵消您从有点霍夫曼编码,但希望您最终仍能节省净额。

如果您使用 Huffman 编码获得 50% 左右的压缩率,然后对结果进行 Base64 编码(再次增加大小),您最终仍会得到比原始结果小 30% 左右的结果。

【讨论】:

  • 我相信这就是我需要的答案。我将继续研究霍夫曼编码。谢谢!
猜你喜欢
  • 2017-11-11
  • 2011-04-28
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2014-11-14
相关资源
最近更新 更多