通常当我需要将我的字符串转换为byte[]
时,我使用getBytes()
而不使用参数。我被检查它不是保存我应该使用charset。为什么我要这样做 - 字母'A'将始终被解析为0x41
?不是吗?
答案 0 :(得分:4)
通常当我需要将我的字符串转换为byte []时,我使用没有param的getBytes()。
立即停止 。我建议您始终指定编码。如果你想使用平台默认编码(如果你没有指定,那就是你会得到的),然后明确地做,以便更清楚。但无论如何,这应该很少。我个人在几乎所有情况下都使用UTF-8。
为什么我要这样做 - 字母'A'将始终被解析为0x41?不是吗?
不。例如,使用UTF-16,'A'将是两个字节 - 0x41 0x00或0x00 0x41(取决于字节顺序)。在EBCDIC编码中,它可能是完全不同的东西。
大多数编码以相同的方式处理ASCII字符 - 但ASCII之外的字符在不同编码中的表示方式非常不同(许多编码仅支持Unicode的子集)。
请参阅我的article on Unicode(C#-focused,但原则相同)以获取更多详细信息 - 以及指向您可能想要的更多信息的链接。
答案 1 :(得分:1)
不同的字符编码会导致字符解析的方式不同。在Ascii中,确保'A'将解析为0x41。在其他编码中,这将是不同的。
这就是为什么当你去一些网页时,你可能会看到一堆奇怪的字符。浏览器不知道如何解码它,所以它只是解码为默认值。
答案 2 :(得分:0)
一些背景知识:当文本存储在文件中或通过套接字在计算机之间发送时,文本字符作为一系列位存储或发送,几乎总是以8位字节分组。这些字符都在Unicode中定义了数值,因此'A'的值总是为0x41(嗯,在Unicode字符集中实际上有两个其他的A,在希腊语和俄语字母表中,但这并不相关)。但是,当存储在文件中或发送到另一台计算机时,如何将这些数字代码转换为位序列有很多机制。在UTF-8中,0x41表示为8位(字节0x41),但其他数值(代码点)将使用重新排列位的算法转换为16位或更多位;在UTF-16中,0x41表示为16位;还有其他编码,如JIS和一些能够代表一些但不是所有Unicode字符的编码。由于String.getBytes()
旨在返回包含要发送到文件或套接字的字节的字节数组,因此该方法需要知道在创建这些字节时应该使用的编码。基本上,编码必须与程序稍后读取文件或插槽另一端的计算机所需的编码相同。