【发布时间】:2019-05-23 05:03:02
【问题描述】:
我从 EditText 获取字符串并且无法正确地将其转换为字节数组,因为它(据我所知)以 UTF-16 编码。我可以设置字符串中写入的所有字符默认为 ASCII 或 UTF-8 吗?或者我可以以某种方式将 UTF-16 转换为 UTF-8 或 ASCII 吗?
我发现解决问题的唯一方法是创建自制代码表,有没有更简单的方法?
【问题讨论】:
我从 EditText 获取字符串并且无法正确地将其转换为字节数组,因为它(据我所知)以 UTF-16 编码。我可以设置字符串中写入的所有字符默认为 ASCII 或 UTF-8 吗?或者我可以以某种方式将 UTF-16 转换为 UTF-8 或 ASCII 吗?
我发现解决问题的唯一方法是创建自制代码表,有没有更简单的方法?
【问题讨论】:
在 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'。
Integer.toBinaryString(asciiBytes[i]) 显示字节值。最有可能的是,字节值完全没问题,您只是通过行为不端的字符串转换来查看它们。
你可以轻松做到。示例:
ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
【讨论】: