是否有一种简单的方法可以避免处理文本编码问题?
如果您从String开始,您还可以执行以下操作:
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
您无法真正避免处理文本编码问题,但现有解决方案:
Reader
到InputStream
:ReaderInputStream
Writer
到OutputStream
:WriterOutputStream
您只需要选择您选择的编码.
好吧,Reader处理字符,InputStream处理字节.编码指定了您希望如何将字符表示为字节,因此您无法真正忽略该问题.至于避免问题,我的意见是:选择一个字符集(例如"UTF-8")并坚持下去.
关于如何实际执行它,正如已经指出的那样," 这些类的明显名称是ReaderInputStream和WriterOutputStream. "令人惊讶的是," 这些不包含在Java库中 ",即使"相反的"类,InputStreamReader和OutputStreamWriter 是包括在内.
因此,很多人都提出了自己的实现,包括Apache Commons IO.根据许可问题,您可能可以在项目中包含commons-io库,甚至可以复制部分源代码(可在此处下载).
Apache ReaderInputStream:API/源代码直接链接
Apache WriterOutputStream:API/源代码直接链接
正如您所看到的,这两个类的文档都指出"JRE支持的所有字符集编码都得到了正确处理".
注意这里对其中一个答案的评论提到了这个错误.但这会影响Apache Ant ReaderInputStream类(此处),而不影响 Apache Commons IO ReaderInputStream类.
另请注意,如果您从一个String开始,您可以跳过创建一个StringReader,并使用Commons IO中的 org.apache.commons.io.IOUtils一步创建一个InputStream,如下所示:
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
当然,您仍然需要考虑文本编码,但至少转换只需一步即可完成.
使用:
new CharSequenceInputStream(html, StandardCharsets.UTF_8);
这种方式不需要预先转换到String
然后byte[]
分配更多堆内存,以防报告很大.它会在从StringBuffer直接读取流时立即转换为字节.
它使用来自Apache Commons IO项目的CharSequenceInputStream.
commons-io 2.0有WriterOutputStream
这些类的明显名称是ReaderInputStream和WriterOutputStream.不幸的是,这些不包含在Java库中.但是,谷歌是你的朋友.
我不确定是否会解决所有文本编码问题,这些问题都是噩梦般的.
有一个RFE,但它是关闭的,不会修复.
你无法避免文本编码问题,但Apache commons-io有
ReaderInputStream
WriterOutputStream
请注意,这些是Peter对koders.com的回答中提到的库,只是指向库而不是源代码的链接.