5

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

4

5 回答 5

18

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

不,您应该始终使用指定字符集的重载;理想情况下在任何地方都使用 UTF-8。如果您使用的是现代版本的 Java,您的代码可以StandardCharsets用于 Good Clean Living。

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

您的代码存在使用错误编码解释字符数据的风险,从而导致字符串损坏/不正确(例如:"î"、、、"ÃÂ""ü"和/或替换字符 (�)。

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

不,根据定义,平台默认值是由平台决定的,而不是您的应用程序。

于 2013-09-30T15:40:44.447 回答
1

使用安全String.getBytes()吗?

这取决于您所说的“安全”是什么意思。它会做你想做的事。

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

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

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

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

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

于 2013-09-30T15:41:57.227 回答
1

JavaDoc 用于getBytes()

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

就像 MattBall 说的那样,最好每次使用getBytes(Charset charset).

于 2013-09-30T15:43:09.690 回答
1

问题 1 的答案:它是安全的,因为如果你使用它,世界将不会不复存在。但是,如果您的意思是要获取它的字节,那么使用它是安全的,只要您使用它指定使用的字符编码的重载。

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

对问题 3 的回答:由于字符在不同字符编码中的编码方式不同,因此它们的数字表示很自然地高度依赖于所使用的字符编码,因此如果您使用更多字符编码,您可能会为同一条消息获得不同的字节数组。这就是为什么强烈建议指定您的字符编码并且您不会遇到此类问题的原因。

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

于 2013-09-30T22:01:01.780 回答
0

使用安全String.getBytes()吗?

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

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

这取决于:

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

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

  • 如果数据被交换,如果只是一个问题。在这种情况下,您最终可能会使用错误的编码,这将导致在解码编码字符时出现乱码。

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

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

于 2013-09-30T15:52:32.403 回答