String.getBytes()在不同的默认字符集中

时间:2013-09-30 15:35:12

标签: java encoding

使用 String.getBytes()是否安全?当程序在具有不同默认值charset?的不同系统上运行时会发生什么我想我可以获得不同的内容byte[]?是否可以在Java 1.4?中定义首选字符集

5 个答案:

答案 0 :(得分:16)

  

使用String.getBytes()?

是否安全

没有。您应该始终使用 the overload which specifies the charset;理想地使用UTF-8 everywhere.如果您使用的是现代版本的Java,您的代码可以使用StandardCharsets进行良好清洁生活。

  

当程序在具有不同默认字符集的不同系统上运行时会发生什么?

您的代码有可能使用错误的编码解释字符数据,导致字符串损坏/不正确(例如:"î""ÃÂ""ü")和/或替换字符( )

  

是否可以在java 1.4中定义首选字符集?

No. The platform-default is, by definition, dictated by the platform, not your app.

答案 1 :(得分:1)

  

使用String.getBytes()安全吗?

这取决于你所说的“安全”。它将完全按照你要做的去做。

  

当程序在具有不同默认字符集的不同系统上运行时会发生什么?我想我可以得到不同的内容byte []?

是。如果您的字符串仅包含ASCII,通常您不会发现任何差异,但即便如此,也可能存在显着差异 - 例如在UTF-16中,每个字符将占用两个字节。

  

是否可以在java 1.4中定义首选字符集?

不是我知道的。例如,我不知道它的标准系统属性。当然,可能有一个用于您正在使用的具体实现。这取决于你的背景。 (例如,您可以在命令行上设置file.encoding系统属性。这是否会影响默认编码取决于VM。它未在System.getProperties中列出。)

我个人总是使用带有字符集名称或Charset的重载来指定您要使用的编码。在您实际想要使用系统默认值的极少数情况下,只需明确指定(例如使用Charset.defaultCharset)。

答案 2 :(得分:1)

getBytes()的JavaDoc:

  

使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。

就像MattBall所说,每次使用getBytes(Charset charset)时最好定义字符集。

答案 3 :(得分:1)

回答问题1:这是安全的,因为如果你使用它,世界将不会停止存在。但是,如果您想要获取其字节,则可以安全地使用它,只要您使用其指定使用的字符编码的重载。

对问题2的回答:如果你正确地进行并指定首选的字符编码(UTF-8),那么没什么特别的。

对问题3的回答:由于字符在不同的字符编码中编码方式不同,因此它们的数字表示很大程度上取决于使用的字符编码,因此如果使用更多字符,则可能会为同一条消息获取不同的字节数组编码。这就是为什么强烈建议你指定你的字符编码,你就不会有这样的问题。

回答问题4:应该可以,但我不是Java 1.4的用户,所以我无法为你测试。

答案 4 :(得分:0)

  

使用String.getBytes()是否安全?

在某些情况下,是的。例如,如果你知道String的编码形式只会在当前主机上使用,那么(可能)是安全的。

  

当程序在具有不同默认字符集的不同系统上运行时会发生什么?

取决于:

  • 如果Strings只包含在不同字符集中编码相同的字符,那么什么都不会出错。例如,如果您只使用简单(罗马)字母和数字以及“普通”标点符号,那么默认字符集是ASCII,LATIN-1还是UTF-8无关紧要。

  • 如果编码的字符串数据是在同一系统上创建和使用的,那么你也应该没问题。

  • 如果数据是互换的,那么只是一个问题。在这种情况下,你可以最终使用错误的编码,这会在编码的字符被解码时产生混乱。

  

我想我可以得到不同的内容字节[]?是否可以在java 1.4中定义首选字符集?

如果您知道内容编码应与默认编码不同,那么您应该使用byte[] getBytes(Charset charset)byte[] getBytes(String charsetName)

相关问题