【问题标题】:Parse csv file with special character like µ using java使用 java 解析具有特殊字符(如 µ)的 csv 文件
【发布时间】:2020-07-05 11:18:49
【问题描述】:

我有一种情况,我必须读取包含特殊字符(如“µ”)的 CSV 文件。这必须使用java来完成。我在做: BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(,"UTF-8"));

在 Windows 中运行正常。但在 redhat linux 环境中,它会将那些特殊字符转换为 '?'。任何帮助都非常感谢

【问题讨论】:

  • 仔细检查正在读取的文件的实际编码。二进制内容很重要。
  • 可能文件没有编码UTF-8
  • 文件编码为“UTF-8”。多次检查。 linux机器的语言环境是“UTF-8”
  • 你如何检查读者返回的内容?文件可能被正确读取,但显示方式有问题
  • 首先检查你的 csv 是否正确写入,看看你的 'µ' 是否正确编码为 UTF-8,并且不是从非常依赖代码转换页面的扩展 ASCII 中获取的。您必须调试您的应用程序并查看从 CSV 获得的字符的确切 UNICODE 值。还有第二种情况:检查是否有任何从/到 UNICODE 到字节的转换。调试您的程序并提供它发生的确切信息,看看是否是这种情况。您必须找到该位置并进行更改,以免发生 UNICODE 到 ASCII 的转换。

标签: java csv parsing unicode special-characters


【解决方案1】:

写入System.out 的输出将使用“平台默认编码”进行编码,该编码在 linux 上由语言环境变量确定(参见locale 命令的输出),而这些又在用户或系统级别配置中设置文件。

在服务器安装中,默认编码通常是ASCII。 "µ" 不是 ASCII 字符,所以它会被转换为 "?"打印时。

有几种方法可以更改默认编码:

  • 在运行程序时设置 Java file.encoding 系统属性,例如

    java -Dfile.encoding=utf-8 yourprogram
    
  • 在运行程序之前设置 LC_CTYPE 环境变量,例如:

    export LC_CTYPE=en_US.UTF-8
    java yourprogram
    
  • 这些方法还会更改输入和文件名等的默认编码。您可以使用 Java 代码专门更改 System.out 的编码:

    PrintStream originalOut = System.out; // in case you need it later
    System.setOut(new PrintStream(System.out, true, "utf-8"));
    

【讨论】:

  • 嗨 Joni ...感谢您的回复。我试过你的建议。在windows下运行,在linux环境下还是失败
  • 尝试编写一个只打印 µ 而什么都不做的程序:public static void main(String... args) { System.out.println("\u00b5"); } 看看是否可行。如果确实如此,则问题出在其他地方。
  • 为什么是 \u00b5 ?我正在尝试将非 ASCII 符号解析为字符
  • 这是一个转义码,编译器将替换为 "µ" 。无论您对源文件使用什么文本编码,它都可以保证工作。如果你在源代码中写“µ”,编译器可能无法正确解释它
猜你喜欢
  • 2011-04-11
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多