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

标签 java encoding

我有一个项目,它从以 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/

相关文章:

c# - 应该在编码中使用什么加密以及它如何影响 key 和初始化向量?

c - 如何在 C/C++ 中设置 ffmpeg qscale 进行图像编码

java - 依赖默认编码,我应该使用什么以及为什么?

java - 优先级队列的值改变后无法自动排序

java - Android 应用程序的 JWT 身份验证

java - 安卓 Firebase Firestore : Get data from deep in Firestore document

php - 这是在我的 CMS 和前端处理特殊字符的正确方法吗?

audio - LAME -- 解码和编码音频文件

java - 使用位操作将 Byte[] 转换为 Long

java - 在 Java 中从父类调用子类构造函数