gpt4 book ai didi

java - 为什么 String.getBytes() 在编译后的 jar 中表现不同?

转载 作者:行者123 更新时间:2023-12-02 05:37:55 29 4
gpt4 key购买 nike

我有一个项目,它从以 latin1 编码的纯文本文件中读取数据,然后使用 UTF-8 编码将其发送到 MySQL 数据库。在早期版本的某些旧代码中,已使用 new String(String.getBytes("UTF-8")) 手动重新编码已从文件中正确读取的字符串。这在 Eclipse 中运行良好,但由于某种原因,在将其编译为可执行的 .jar 后,这导致字符串以 latin1 编码发送,尽管将 JDBC 显式定义为 UTF-8 编码。删除不必要的转换后,它在 IDE 和编译的 jar 中都可以正常工作。

我想知道是什么原因造成的。 jar 和 IDE 在同一系统上执行,除非 Eclipse 添加一些设置,否则我不知道 VM 设置是否相同。此行为在其他计算机上也以完全相同的方式可见。

最佳答案

有两个问题:

new String(String.getBytes("UTF-8"))

采用默认系统编码来创建新字符串。您应该始终显式指定新字符串的编码,例如

new String(String.getBytes("UTF-8"), "UTF-8")

很可能其他系统上的默认编码不同,导致字符集转换(例如从 UTF-8 到 Cp1252)。

仅当字符串读取不正确且目标字符集与源字符集不同时,您应用的转换才相关。例如:您最初读取一些字节为 Cp1252,但是您随后需要将其转换为另一个字符集(例如 Cp1250)。那么你会这样做:

new String(String.getBytes("Cp1252"), "Cp1250")

这会将字符串中的字符转换为 Cp1252 中的字节,然后获取这些字节并在 Cp1250 中解释它们。对于某些(但不是全部)字符,这将映射到相同的字符,但其他字符将被重新映射。

如果字符串已经按照您在问题中暗示的那样被正确读取,那么这样做是完全没有意义的。在内部,Java 中的字符串只是一个字符数组,仅当持久化为字节数据(或从字节数据读取)时才与编码相关。

关于java - 为什么 String.getBytes() 在编译后的 jar 中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24804631/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com