繁体   English   中英

如何从 url 读取 csv 文件,java 中有 utf-8 个字符

[英]How to read csv file from url with utf-8 chars in java

如何正确读取java中的a.csv文件? 我有一个 utf-8 编码的文件,但无法正确读取某些字符。

在此处输入图像描述

我的代码:

String link = new String("https://stat.gov.pl/download/gfx/portalinformacyjny/pl/defaultstronaopisowa/4741/1/1/miesieczne_wskazniki_cen_towarow_i_uslug_konsumpcyjnych_od_1982_roku.csv");

URL url = new URL(link);

BufferedReader read = new BufferedReader(
        new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
String i;
while ((i = read.readLine()) != null)
    System.out.println(i);
read.close();

https://stat.gov.pl/download/gfx/portalinformacyjny/pl/defaultstronaopisowa/4741/1/1/miesieczne_wskazniki_cen_towarow_i_uslug_konsumpcyjnych_od_1982_roku.csv

那不是UTF-8!

因此,为什么您的代码失败了。 您假设它是 UTF-8。它不是。 此外,标头告诉您它是“二进制”(实际上不是,但重点是,服务器也没有给您字符集),因此您必须猜测。 可能是Windows-1250。

这个字节序列在那个 CSV 中:

57 61 72 74 6F 9C E6

最后两个是“有趣的”(另一个在 ASCII 块中,所以几乎每个编码都相同)。 所以那读Warto? 在哪里? 是有趣的部分。 如果这是Windows-1250 ,则拼写为 Wartość。 谷歌告诉我那是波兰语。

所以,你需要做三件事来解决这个问题:

  1. 不要假设一切都是 UTF_8。
  2. 学习 mojibake 侦探技能。 这涉及原始下载内容,使用十六进制编辑器,寻找看起来像熟悉术语一半的内容(例如 Warto..),然后查找可能的代码页并检查字节是否与您认为的相符。 这是一个拖累。 它没有捷径,当服务器不告诉你编码是什么时,mojibake 侦探技能是你唯一的选择。
  3. StandardCharsets.UTF_8替换为"Windows-1250" ,我很确定它适用于任何 JVM。如果不是,oof。 您必须自己编写该代码页并将其注册为字符集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM