【问题标题】:Difference between String.length() and String.getBytes().lengthString.length() 和 String.getBytes().length 之间的区别
【发布时间】:2013-04-22 16:01:17
【问题描述】:

我是 Java 编程的初学者和自学者。 所以,我想知道String.length()String.getBytes().length在Java中的区别。

什么比较适合检查字符串的长度?

【问题讨论】:

  • 你的实验有什么建议?
  • 你试过在 unicode 字符串上使用它吗?
  • string.length 将给出字符串中的字符数,string.getBytes().length 将给出字符串用于存储值的字节数。在正常情况下,每个字符可以占用 2 个字节来存储一个 unicode 值
  • @ArunPJohny:不,string.length 将返回字符串中“Unicode 代码单元”的数量。对于 ASCII 文本,它将计算字符数。对于任意 Unicode 文本,它......很复杂。有关丑陋的细节,请参阅 BeeOnRope 的答案。

标签: java string


【解决方案1】:

String.length()

String.length() 是表示字符串所需的 16 位 UTF-16 代码单元 的数量。也就是说,它是用于表示字符串的char 值的数量,因此也等于toCharArray().length。对于西方语言中使用的大多数字符,这通常与字符串中的 unicode 字符(代码点)的数量相同,但如果任何 UTF-16 surrogate pairs 是,代码点的数量将小于代码单元的数量用过的。此类对仅用于对BMP 之外的字符进行编码,并且在大多数写作中为rarely used(表情符号是常见的exception)。

String.getBytes().length

String.getBytes().length 另一方面是在平台的默认编码中表示您的字符串所需的字节数。例如,如果默认编码是 UTF-16(很少见),那么它将正好是 String.length() 返回值的 2 倍(因为每个 16 位代码单元需要 2 个字节来表示)。更常见的是,您的平台编码将是多字节编码,例如 UTF-8。

这意味着这两个长度之间的关系更加复杂。对于 ASCII 字符串,这两个调用几乎总是会产生相同的结果(除了不将 ASCII 子集编码为 1 个字节的异常默认编码之外)。在 ASCII 字符串之外,String.getBytes().length 可能更长,因为它计算表示字符串所需的字节数,而 length() 计算 2 字节代码单元。

哪个更合适?

通常您将String.length() 与其他将偏移量带入字符串的字符串方法一起使用。例如,要获取最后一个字符,您可以使用 str.charAt(str.length()-1)。如果由于某种原因您正在处理由getBytes 返回的字节数组编码,则只能使用getBytes().length

【讨论】:

    【解决方案2】:

    length() 方法以字符为单位返回字符串的长度。

    字符可能占用多个字节。表达式String.getBytes().length 使用平台的默认字符集返回字符串的长度(以字节为单位)。

    【讨论】:

    • 没有这种方法getLength()我想你的意思是String.getBytes().length
    • @BuSaeed - 已修复。谢谢。
    【解决方案3】:

    String.length() 方法返回字符串中符号的数量。而String.getBytes().length() 返回用于存储这些符号的字节数。 通常,字符以 UTF-16 编码存储。所以存储一个字符需要 2 个字节。 看看这个SO answer

    我希望它会有所帮助:)

    【讨论】:

      【解决方案4】:

      简而言之,String.length() 返回字符串中的字符数,而String.getBytes().length 返回表示字符串中指定编码字符的字节数。

      在许多情况下,String.length() 将具有与String.getBytes().length 相同的值。但是在编码 UTF-8 并且字符的值超过 127 的情况下,String.length() 将与String.getBytes().length 不同。 这是an example,它解释了在调用String.getBytes() 时如何将字符串中的字符转换为字节。这应该让您了解String.length()String.getBytes().length 之间的区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-12
        • 2021-07-29
        • 1970-01-01
        • 2011-10-02
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多