java - 即使在使用 UTF8 后处理 InputStreamReader 时也不会保留字符编码
问题描述
有数据:
batiment:Kube D
etage:4ème
description:some_description
我想通过 InputStreamReader 的东西来获取这些数据:
SharedByteArrayInputStream sbais = (SharedByteArrayInputStream) content;
Reader reader = new InputStreamReader(sbais, Charset.forName("UTF8"));
int size = sbais.available();
char[] theChars = new char[size];
int data = reader.read();
int i = 0;
while (data != -1) {
theChars[i] = (char) data;
i++;
data = reader.read();
}
String parse = new String(theChars);
String[] parties = parse.split("Content-Transfer-Encoding: quoted-printable");
String partie = (parties[1]).trim();
parties = partie.split("\\R");
String ret = "";
for(String ligne : parties) {
if (ligne == null || ligne.trim().equals(""))
break;
ret = ret.concat(ligne).concat(System.lineSeparator());
}
return ret;
在运行时,数据4ème
被转换为4=E8me
那么有什么问题呢?
编辑 :
这是内容的标题:
--_008_DB6P190MB0166B6F4DE5E31397B4A7B558C3C9DB6P190MB0166EURP_
Content-Type: multipart/alternative;
boundary="_000_DB6P190MB0166B6F4DE5E31397B4A7B558C3C9DB6P190MB0166EURP_"
--_000_DB6P190MB0166B6F4DE5E31397B4A7B558C3C9DB6P190MB0166EURP_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
batiment:KUBE D
etage:4=E8me
description:andrana
Cordialement,
...
解决方案
我们可以看到您忽略了 String 之前内容中的所有内容Content-Transfer-Encoding: quoted-printable
。
这意味着您的初始内容实际上是4=E8me
,它对应于一个 ISO-8859-1 字符串,用quoted-printable编码。
如果要将其转换为4ème
,则必须对其进行解码。
没有什么是开箱即用的,但是这个答案会给你一些你可以使用的库的想法。
例如使用Apache Common Codec,它会是这样的:
partie = new QuotedPrintableCodec(StandardCharsets.ISO_8859_1).decode(partie);
推荐阅读
- react-native - RNN [v2]:如何正确地从堆栈切换到底部选项卡
- flyway - 为什么 org.flywaydb.core.Flyway API 没有加载内置的 mysql 驱动程序
- java - 进程不会在 Java 中停止
- python - 当在python中的dict中找不到键值时,如何为dict中的键设置默认值
- sql-server-2008 - 无法打开与数据库的连接
- r - 根据来自不同数据帧的第二(较短)列的值将值分配给列
- selenium-webdriver - 处理此 Microsoft Edge 弹出窗口的所需功能是什么?
- apache-spark - 剂量火花累加器导致 saveAsTextFile() 进入一个分区?
- ios - 在 UIStackView 的子视图(数组)中访问 UIViewController 组件
- javascript - 更改为使用自定义下拉菜单后看不到父变量?