【问题标题】:What is the one line max length limit in XML files?XML 文件中的单行最大长度限制是多少?
【发布时间】:2019-09-25 21:37:12
【问题描述】:

Recently I've faced an issue related to max line (string) length limit in a path attribute of vector xml。在我的情况下,51k 个字符似乎是一个超限,而 29k 是可以的。无论如何,我想它与某种特定类型的 xml 无关,例如 manifest、string、style、attr、drawable、layout 或其他任何类型的 xml,我敢肯定它是一般的Android 项目中任何 xml 的限制。
所以我很好奇 什么是限制(我的意思是 Android xml 中一行允许的确切最大字符数) 以及为什么 AndroidStudio 在矢量导入时不应用它?谷歌似乎不知道这个限制本身,或者它可能是一个 gradle 的限制。
请不要指出长字符串不好 - 我确实意识到这一点并且它不会取消我的问题。
伙计们,请仔细阅读我的问题和其他您可能认为是骗子的问题!那里没有我的问题的答案。
Android strings.xml length SO 问题绝对有其他含义。提问者询问是否有办法获取strings.xml 中的字符串数。除此之外,我的问题与strings.xml 不完全相关,而是与任何xml 文件完全相关。
Android IndexOutOfBound Exception for resource getString 绝对是另一个异常/问题,并且绝对没有回答我的问题。同样,我的问题与 strings.xml 完全无关。
What is the maximum amount of data that a String can hold in java? 不是我要问的,它与 Java String 类限制有关。即使它是相关的,那么限制大约是Integer.MAX/2(因为对于 Unicode,它需要 2 个字节来编码 1 个字符)所以它无论如何都不是 51k 字符。

【问题讨论】:

  • 兄弟,你写了很多关于你的问题的文章,但你不是在你的观点上,你能简单地描述一下你的问题吗?请具体一点。
  • 以前我写了一个简单而简短的问题,它被标记为重复我不知道的原因(链接的重复问题完全不同,感谢@Marcin Orlowsky,他没有意识到我在我的问题题)。 我的问题的要点也标记为粗体。请点击第一个链接,您将在那里看到屏幕截图,这可能有助于理解。
  • 顺便说一句,您为什么不将我的问题取消标记为重复?绝对不是。

标签: android


【解决方案1】:

我猜你的问题是限制在 29k 和 51k 之间,但被剪裁为一个逻辑数字

我可能通过测试找到了答案。 正如您所说,一个 char 存储在两个字节上。所以 29k char 将是 58k 字节,而 51k 将是 102k 字节。 “逻辑”限制为 65536,因为它是 2^16。所以 char 的限制是 2^16 / 2 或 2^15 即 32768

我测试将字符串放入我的 string.xml 中(基本上是一长行的 'a')

<string name="length_test32000">(32 000 a)</string>
<string name="length_test32767">(32 767 a)</string>
<string name="length_test32768">(32 768 a)</string>
<string name="length_test32769">(32 769 a)</string>
<string name="length_test33000">(33 000 a)</string>

然后我尝试记录它们的大小:

String test32k = getString(R.string.length_test32000);

String test32k767 = getString(R.string.length_test32767);
String test32k768 = getString(R.string.length_test32768);
String test32k769 = getString(R.string.length_test32769);

String test33k = getString(R.string.length_test33000);

Log.i("tag", "32000 : "+test32k.length());
Log.i("tag", "32767 : "+test32k767.length());
Log.i("tag", "32768 : "+test32k768.length());
Log.i("tag", "32769 : "+test32k769.length());
Log.i("tag", "33000 : "+test33k.length());

结果如下:

I/tag: 32000 : 32000
I/tag: 32767 : 32767
I/tag: 32768 : 16
I/tag: 32769 : 16
I/tag: 33000 : 16

从 32768 开始,它似乎被截断了,所以我记录了里面的内容

Log.i("tag", "32768 : "+test32k768.length() + " content : " + test32k768);

结果是:

I/tag: 32768 : 16 content : STRING_TOO_LARGE

最大字符 似乎 为 32767 (2^15 - 1) 个字符。我没有找到任何官方文档这样说,但这是我在测试时发现的

【讨论】:

  • 谢谢,伙计。实际上我得出了同样的结论,我的猜测是关于 2 的幂,也是 32767(因为 29k 可以,51k 不是),我要检查一下。有趣的是,谁对这个限制负责?是 AndroidStudio 还是 gradle?
  • 它确实编译并运行,因为我检查了 logcat,所以我不知道谁负责该限制
  • 这个限制也不是来自 String 类,因为我可以在不使用 xml 的情况下直接在活动中分配这个值,并且可以显示大于 32767 的大小,所以它确实受到 xml 导入的限制跨度>
  • 是的,重点是它可以编译,但在运行时你会遇到一些神秘的崩溃,比如 ResourceNotFound 等。这是最糟糕的事情。
猜你喜欢
  • 2011-10-15
  • 2023-03-13
  • 2023-03-03
  • 2014-01-17
  • 1970-01-01
  • 2011-04-27
  • 2011-06-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多