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