【问题标题】:Charset unable to read € (Euro Symbol) from a dsv file in javaCharset 无法从 java 中的 dsv 文件中读取 €(欧元符号)
【发布时间】:2018-08-01 10:19:21
【问题描述】:

从 dsv 文件中读取欧元符号时,以下代码不起作用。

CSVReader csvReader = new CSVReaderBuilder(Files.newBufferedReader(sourceFile, Charset.forName("ISO-8859-9"))).withCSVParser(csvParser).build();

上一行中使用的Charset 是否不正确?

也尝试了ISO-8859-1ISO-8859-15,但没有成功。

【问题讨论】:

  • 我们并不神奇地知道文件在哪个字符集中。您可以检查文件中欧元符号的字节值并尝试找出编码。
  • 你说“不起作用”。它会抛出异常吗?一些后来的程序逻辑是否表现得很奇怪?某些控制台中的某些输出看起来是否与预期不同?请给我们更多的细节。请在 Notepad++ 中打开文件,选择正确的编码以便您看到正确显示的欧元符号,并从 Notepad++ 的状态行告诉我们编码。

标签: java character-encoding


【解决方案1】:

不要猜测。您需要找出 CSV 文件实际使用的编码。
所以,启动你最喜欢的 hex-editor 或 -viewer 并寻找 字符。

  • ISO-8859-15 中, 字符由十六进制A4(1 个字节)表示
  • ISO-8859-1 中, 字符不可表示
  • ISO-8859-9 中, 字符不可表示
  • UTF-8 中, 字符由十六进制E2 82 AC(3 个字节)表示
  • windows-1252 中, 字符由十六进制80(1 个字节)表示
  • ...

【讨论】:

  • 您好 Thomas,感谢您的回复。它由 1 个字节表示,因此尝试使用 ISO-8859-15...但无法读取欧元符号
  • @MelbaMartis 究竟是哪个字节?然后是另一种编码。可能是ISO-8859 系列中的另一个,因为所有这些都是 1 字节编码。
  • 最有可能是 Windows-1252。具有具体值的完美答案,并暗示十六进制编辑器。 NotePad++ / JEdit 等可以使用不同的字符集。
【解决方案2】:

我建议尝试使用字符集UTF-8 读取 UTF-8 中的一些编码是单字节码。这可能会有所帮助。还有一个实用程序可以帮助您诊断问题。有一个名为 MgntUtils 的开源 java 库(由我编写),它具有将任何字符串转换为 unicode 序列的实用程序,反之亦然。您所要做的就是:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

它会返回字符串"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

这同样适用于任何语言的任何字符串,包括特殊字符。这是文章 Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison 的链接,该文章解释了该库以及从何处获取它(Maven centralgithub 均可用。在文章中搜索段落:“字符串 Unicode 转换器”.

因此,当您阅读您的字符串时,请转换它,看看会发生什么。请注意,欧元符号的统一是 \u20AC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多