当我尝试从文档中获取文本时,如果它后跟一些特殊字符,例如 TM 或 C(用于版权)等,在将其写入文本文件后,它会添加一些意想不到的内容。例如,我们可以考虑以下内容:
如果我们有Apache™ Hadoop™!
,然后如果我们尝试写入文本,FileOutputStream
那么结果将是这样Apacheâ Hadoopâ
的,这â
对我来说是无意义的,通常我想要一种方法来检测文本中的这些字符并跳过它们来编写它们,有没有解决方案到这个?
当我尝试从文档中获取文本时,如果它后跟一些特殊字符,例如 TM 或 C(用于版权)等,在将其写入文本文件后,它会添加一些意想不到的内容。例如,我们可以考虑以下内容:
如果我们有Apache™ Hadoop™!
,然后如果我们尝试写入文本,FileOutputStream
那么结果将是这样Apacheâ Hadoopâ
的,这â
对我来说是无意义的,通常我想要一种方法来检测文本中的这些字符并跳过它们来编写它们,有没有解决方案到这个?
原因是字符编码问题。在将字符串写入文件之前,您需要对字符串字符进行编码。
你可以使用如下:
Writer out = new OutputStreamWriter(new FileOutputStream(
new File("D://helloWorld.txt")), "UTF8");
String tm ="Apache™ Hadoop™";
out.write(tm);
out.close();
我最初误读了这个问题,没有注意到你想跳过它们。我暂时把它留在这里,如果有人发布更好的东西,我会删除它。
要正确处理字符,您可以将字符集显式设置为 ISO-8859-1。为此,您需要使用类似OutputStreamWriter
.
final OutputStreamWriter writer;
writer = new OutputStreamWriter(new FileOutputStream(file),
Charset.forName("ISO-8859-1"));
writer.write(string);
writer.close();
这不会跳过它们,但应该正确编码它们。
如果您只想要可打印的 ASCII 范围,那么逐个字符地迭代您的字符串以构建一个新字符串。仅当字符在 to 范围内时才包含该0x20
字符0x7E
。
final StringBuilder buff = new StringBuilder();
for (char c : string.toCharArray())
{
if (c >= 0x20 && c <= 0x7E)
{
buff.append(c);
}
}
final FileWriter w = new FileWriter(...);
w.write(buff.toString());
w.close();
如果要保留回车和换行符,还需要考虑0x0A
and 0x0D
。