2013-04-05 92 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