如何在java中使用UTF-8字符从url读取csv文件

rseugnpd  于 2022-12-06  发布在  Java
关注(0)|答案(1)|浏览(212)

如何正确读取java中的.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();
q43xntqr

q43xntqr1#

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。
1.学习乱码侦探技巧。这包括下载原始的东西,使用十六进制编辑器,寻找看起来像熟悉术语的一半的东西(比如Warto..),然后查找可能的代码页,检查字节是否与你认为的应该是匹配。这是一个拖动。没有快捷方式,当服务器不告诉你编码是什么时,你唯一的选择就是掌握侦探技巧。
1.将StandardCharsets.UTF_8替换为"Windows-1250",我确信它可以在任何JVM上工作。如果不能,那么就得自己编写代码页并将其注册为字符集。

相关问题