【问题标题】:German characters encoding problem when data are loaded from database从数据库加载数据时的德语字符编码问题
【发布时间】:2020-03-25 06:48:10
【问题描述】:

我正在创建一个将对象转换为 JSON 的单元测试,但我遇到了一些特殊字符的问题:

String expectedResponse = gson.toJson(callReasonRepository.findAll());

我收到的是:Verfügung 而不是 Verfügung

我的项目设置为UTF-8。知道为什么会这样吗?还有什么我可以提供的吗?

【问题讨论】:

  • 不是真的,因为我只是调用存储库而已。
  • 该问题通常与混合编码有关。你的程序使用 UTF-8 编码?不知道您可以在项目级别设置编码。您可以为源文件和资源设置编码。您如何/在哪里设置编码?你的callReasonRepository 工作正常吗?使用不同的编码将 UTF-8 编码的字符串保存到数据库时可能会出现问题。你在哪里看到错误的字符?在调试器中?在命令行上?在日志文件中?那里使用什么编码(默认系统编码?日志文件编码?)。

标签: java json utf-8 character-encoding gson


【解决方案1】:

当数据使用UTF_8 字符集编码但您使用windows-1252(或ISO-8859-1)读取它们时,会出现此问题。我创建了以UTF-8 编码的JSON 文件:

{
  "value": "Verfügung"
}

并使用以下代码将其读取为Map

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder().create();

        Charset outputEncoding = Charset.forName("windows-1252");

        try (InputStreamReader reader = new InputStreamReader(new FileInputStream(jsonFile), outputEncoding)) {
            Map map = gson.fromJson(reader, Map.class);
            System.out.println(map);
        }

        byte[] bytes = "Verfügung".getBytes(StandardCharsets.UTF_8);
        System.out.println(new String(bytes, outputEncoding));
    }
}

应用打印上方:

{value=Verfügung}
Verfügung

GsonApp 文件也编码为UTF-8

我猜,在您的情况下,您使用默认系统字符集读取UTF-8 编码数据,可能是windows-1252。您从DB 加载数据,因此您可能需要在连接字符串中将编码显式设置为UTF-8。请参阅MySQL 数据库的示例:JDBC character encoding

另见:

【讨论】:

    【解决方案2】:

    我不能确定,因为我只能看到您显示的内容而不是底层字节,但我会说您只是显示问题。

    德语 'ü' 字符是 unicode U+OOFC,它在 UTF-8 中给出字节对 b'\xc3\xbc'。但是,如果您的显示器需要 Latin1 或其 Windows 变体 cp1252,\xc3'Ã' 的代码,\xbc'¼' 的代码。为了确保这一点,您应该尝试将其直接写入文件并使用具有 hexa 功能的编辑器(如出色的 vim)来控制实际的字节内容。

    换句话说,代码按照您的要求执行,但显示程序不遵守 UTF-8 编码,要么是因为它不能,要么是因为您忘记声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 2013-05-17
      • 2021-11-21
      相关资源
      最近更新 更多