2013-04-05 98 views
0

我遇到了解析其中含有非法字符(二元标记)的文本文件的问题。的回答会是这样如下:使用java.nio处理带有二进制数据的字符串

test.csv

^000000^id1,text1,text2,text3 

这里^000000^是源文件中的非法字符的文本表示。

我正在考虑在处理它之前使用java.nio来验证行。所以,我想引入一个Validator特征如下:

import java.nio.charset._ 
trait Validator{ 
    private def encoder = Charset.forName("UTF-8").newEncoder 
    def isValidEncoding(line:String):Boolean = { 
    encoder.canEncode(line) 
    } 
} 

你们认为这是处理这种情况的正确方法吗?

谢谢

+0

那么,它的工作?如果是,你就完成了!如果没有(或“不够好”),那么哪里出了问题? – 2013-04-05 18:25:44

+0

@RexKerr - 理想情况下,我希望验证器能够确保字符串的内容符合en-US。在字符编码/解码技术方面仍然有所改进,但我想知道是否有任何经过验证的方法可以遵循。 – 2013-04-05 19:03:18

回答

2

如果您已经有String,则为时已晚,UTF-8可以始终编码任何字符串*。您需要到最初解码文件的位置。


ISO-8859-1是具有令人感兴趣的性质的编码:

  • 准确地说,任何字节序列是有效的ISO-8859-1
  • 每个解码字符的码点是完全一样的作为字节的值,它是从

解码所以,你可以解码文件为ISO-8859-1,只是剥离非英文字符:

//Pseudo code 
str = file.decode("ISO-8859-1"); 
str = str.replace("[\u0000-\u0019\u007F-\u00FF]", ""); 

您也可以逐行迭代,并忽略包含[\u0000-\u0019\u007F-\u00FF]中某个字符的每一行,如果这就是在处理它之前通过验证一行的含义。


我还想到,二进制标记可能是BOM。您可以使用十六进制编辑器查看值。

*除了那些非法代理人,这可能不是这种情况。

2

二进制数据不是字符串。不要试图绕过转换为String时违法的输入序列。

如果您的输入是任意字节序列(即使其中许多字符符合ASCII),甚至不要尝试将其转换为String