【问题标题】:How to get string of UTF-8 or ASCII instead of UTF-16 by default?默认情况下如何获取 UTF-8 或 ASCII 而不是 UTF-16 的字符串?
【发布时间】:2019-05-23 05:03:02
【问题描述】:

我从 EditText 获取字符串并且无法正确地将其转换为字节数组,因为它(据我所知)以 UTF-16 编码。我可以设置字符串中写入的所有字符默认为 ASCII 或 UTF-8 吗?或者我可以以某种方式将 UTF-16 转换为 UTF-8 或 ASCII 吗?

我发现解决问题的唯一方法是创建自制代码表,有没有更简单的方法?

【问题讨论】:

    标签: java android char


    【解决方案1】:

    在 Java 中,String 是 Unicode 字符序列(或代码点,请参见脚注 1)。您通常可以忽略 Java 如何将其存储在其内存中。重要的是 Java String 可以保存任何 Unicode 字符序列。

    当谈到 ASCII、UTF-8、ISO-8859-1 或类似的东西时,它们是编码,是如何将字符表示为字节的规则。 Java 内置了对所有相关编码的支持,例如要获得一个 ASCII 编码的字节序列,您可以使用

    byte[] asciiBytes = string.getBytes("US-ASCII");
    

    现在您可以说asciiBytes 拥有给定string 的ASCII 编码。

    最后一个建议:尽量避免代码核心中的编码,仅在读取或写入包含文本内容的文件时使用它。像InputStreamReader 这样的类允许你指定文件编码。


    (1) 字符和代码点之间仍然存在细微差别,出于本答案的目的,我们将忽略它。

    【讨论】:

    • 试图这样做,但问题是我得到了错误的字节。例如,我有 String a = "ababccd" ,使用此方法后,我得到 7 个字节(10000110 01000110 10000110 01000110 11000110 11000110 00100110),但这些字节的十进制值与其 ASCII 码不匹配。例如十进制的01000110 = 70,但在ASCII表中不是'c',而是'F'。
    • 所以,当我将其转换回 char 时,它显示的不是 'c' 而是 'F'
    • 您以某种方式从错误的一端读取字节中的位。而不是 10000110,而是将其读取为 01100001,并且您会得到“a”的 ASCII 代码,正如预期的那样。作为参考,用Integer.toBinaryString(asciiBytes[i]) 显示字节值。最有可能的是,字节值完全没问题,您只是通过行为不端的字符串转换来查看它们。
    • 哦,是的,这完全是我的错误,在我的程序早期以错误的方式读取位。谢谢指点!
    • 很高兴我能帮上忙。
    【解决方案2】:

    你可以轻松做到。示例:

    ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 2011-12-13
      • 1970-01-01
      • 2016-05-31
      • 2010-09-21
      • 2019-06-16
      • 2014-02-09
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多