Java 将其写入文本文件后会出现意外字符

Java 将其写入文本文件后会出现意外字符,java,file,fileoutputstream,Java,File,Fileoutputstream,当我试图从文档中获取文本时,如果后面跟有一些特殊字符,例如TM或C(用于版权保护)等,在将其写入文本文件后,会向其中添加一些意外的内容。作为一个例子,我们可以考虑如下: 如果我们有Apache™ Hadoop™!然后如果我们尝试使用FileOutputStream将其写入文本,那么结果将类似于Apache–Hadoop,而对我来说是无稽之谈,通常我想要一种方法来检测文本中的此类字符,并跳过它们来编写它们,这个问题有解决办法吗?我原来看错了问题,没有注意到你想跳过它们。我现在就把这个放在这里,如果

当我试图从文档中获取文本时,如果后面跟有一些特殊字符,例如TM或C(用于版权保护)等,在将其写入文本文件后,会向其中添加一些意外的内容。作为一个例子,我们可以考虑如下:


如果我们有
Apache™ Hadoop™!
然后如果我们尝试使用
FileOutputStream
将其写入文本,那么结果将类似于
Apache–Hadoop
,而
对我来说是无稽之谈,通常我想要一种方法来检测文本中的此类字符,并跳过它们来编写它们,这个问题有解决办法吗?

我原来看错了问题,没有注意到你想跳过它们。我现在就把这个放在这里,如果有人发布更好的东西,我会删除它


要正确处理字符,可以显式地将字符集设置为ISO-8859-1。为此,您需要使用类似于
OutputStreamWriter
的工具

final OutputStreamWriter writer;

writer = new OutputStreamWriter(new FileOutputStream(file),
                                Charset.forName("ISO-8859-1"));
writer.write(string);
writer.close();

这不会跳过它们,但应该正确编码。

原因是字符编码问题。在将字符串写入文件之前,需要对字符串进行编码。
您可以使用以下类似的方法:

    Writer out = new OutputStreamWriter(new FileOutputStream(   
                        new File("D://helloWorld.txt")), "UTF8");
    String tm ="Apache™ Hadoop™";
    out.write(tm);
    out.close();

如果只需要可打印的ASCII范围,则逐个字符地迭代字符串,生成一个新字符串。仅当字符在
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();
final StringBuilder buff=new StringBuilder();
for(char c:string.toCharArray())
{

如果(c>=0x20&&c)您使用什么字符编码来写入文件?@gregkopf我不知道,可能是因为默认情况下我只需生成一个FileOutputStream,然后使用write()方法写入文本文件定义“这样的字符”。你想跳过除ASCII字符以外的所有字符吗?包括那些可能是人名一部分的字符吗?故意丢失数据通常是一个非常糟糕的主意。@MichaelBorgwardt是的,我只想要ASCII代码,对于我的工作来说,如果它是人名的一部分就可以了,因为在此阶段之前,这些特殊字符将被删除,所以你能提出任何建议吗检测和跳过这些非ASCII字符的解决方案?当我尝试编写它们时,它会忽略TM吗?意味着我希望有一种方法可以忽略这些字符,例如Apache™ 你可以尝试UTF-8编码,但也要知道,你打开文本文件时使用的任何程序都需要知道字符编码。你的答案是对的,但如果你能给我一种方法,让我把它写成Apache Hadoop,我将不胜感激。对不起,我不明白你的意思ants跳过ASCII字符集中没有的字符。@user1064929您不需要跳过特殊字符,通过使用UTF8编码,结果不会像Apache–Hadoop–那样。如果跳过它,可能结果不是您真正想要的。