2012-05-09 23 views
0

当我尝试从文档中获取文本时,如果后面跟着TM或C(版权)等特殊字符,写入文本后文本文件,它会使一些意想不到的添加到它。作为一个例子,我们可以考虑以下几点:写入文本文件后出现意想不到的字符

如果我们有Apache™ Hadoop™!,然后,如果我们试图在写入使用FileOutputStream然后导致文本会像Apacheâ Hadoopâ其中â是无稽之谈,我一般我想办法检测文本中的这些字符并跳过写入它们,是否有解决方案?

+3

你用什么字符编码来编写文件? –

+0

@GregKopff我不知道,也许是默认原因,我只是简单地做一个** FileOutputStream **,然后使用write()方法写入文本文件 – lonesome

+0

定义“这样的字符”。你想跳过除ASCII字符之外的所有内容吗?包括那些可能是人名的一部分?故意丢失数据通常是一个非常糟糕的主意。 –

回答

0

如果你只想打印ASCII范围,然后通过文字建立一个新的字符串遍历您的字符串的字符。仅在字符的范围在0x200x7E之间时才包含该字符。

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(); 

如果你想保持回车和换行符,你还需要考虑0x0A0x0D

0

我最初错误地阅读了这个问题,并没有注意到你想跳过它们。我现在就把它留在这里,如果有人发布更好的东西,它会删除它。


要正确处理字符,可以将字符集显式设置为ISO-8859-1。要做到这一点,你需要使用类似OutputStreamWriter的东西。

final OutputStreamWriter writer; 

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

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

+0

当我尝试写入它时,会忽略TM吗?意思是我希望有一种方法可以忽略这些字符然后例如** Apache™**将被视为** Apache **在写入之前 – lonesome

+0

现在看起来像这样**Apache Hadoop ** – lonesome

+0

您可以尝试UTF-8编码 - 但也要知道,您打开文本文件的程序还需要了解字符编码。 –

0

原因是字符编码问题。在将字符串写入文件之前,您需要编写字符串字符。
您可以像使用如下:

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

你的回答是对的,但是如果你能给我一个方法把它写成 ** Apache Hadoop **那么我会很感激 – lonesome

+0

对不起,我不明白你的意思。 –

+0

他想跳过不在ASCII字符集中的字符。 –