2014-10-16 18 views
0

我試圖解析從文件中獲取的JSON字符串時遇到問題。我的問題是,當我讀入時,零寬度不間斷空格字符(unicode 0xfeff)在我的字符串的開頭,而我無法擺脫它。我不想使用正則表達式,因爲有可能會有其他隱藏字符具有不同的unicode。當閱讀文件時找不到零寬度無間斷空間

這是我有:

StringBuilder content = new StringBuilder(); 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("src/test/resources/getStuff.json")); 
     String currentLine; 
     while((currentLine = br.readLine()) != null) { 
      content.append(currentLine); 
     } 
     br.close(); 
    } catch(Exception e) { 
     Assert.fail(); 
    } 

這是JSON文件的開始(它太長了複製粘貼整個事情,但我已經證實它是有效的):

{"result":{"data":{"request":{"year":null,"timestamp":1413398641246,... 

這裏是我試過到目前爲止:

  • 複製JSON文件,記事本+ +,並顯示所有字符
  • 複製文件到記事本++和轉換爲UFT-8無BOM,和ISO 8859-1
  • 在其他文本編輯器,例如昇華,並保存爲UFT-8
  • 複製JSON文件到一個txt文件
  • 打開JSON文件和讀取,在
  • 使用替代的BufferedReader掃描儀試圖
  • 在的IntelliJ我試過視圖 - >活動的編輯器 - >顯示空格

我怎樣才能讀取這個文件,而無需零寬度不中斷字符串開頭的空格字符?

回答

1

0xEF 0xBB 0xBF是UTF-8 BOM0xFE 0xFF是UTF-16BE BOM,和0xFF 0xFE是UTF-16LE BOM。如果0xFEFF存在於您的字符串的前面,則表示您創建了一個帶有BOM的UTF編碼文本文件。 UTF-16 BOM可能顯示爲0xFEFF,而如果BOM本身從UTF-8解碼爲UTF-16(即讀者檢測到BOM但未跳過),則UTF-8 BOM僅顯示爲0xFEFF它)。實際上,已知Java不處理UTF-8 BOM(請參閱錯誤JDK-4508058JDK-6378911)。

如果你讀了FileReaderdocumentation,它說:

這個類的構造方法假定默認字符編碼和默認字節緩衝區大小是適當的。要自己指定這些值,請在FileInputStream上構建一個InputStreamReader。

您需要使用識別字符集的閱讀器讀取文件內容,最好是能夠爲您讀取物料清單並根據需要在內部自行調整的閱讀器。但更糟的情況是,您可以自己打開文件,讀取前幾個字節以檢測是否存在BOM,然後使用適當的字符集構造閱讀器來讀取文件的其餘部分。下面是使用org.apache.commons.io.input.BOMInputStream所做的正是這樣的例子:

(從https://stackoverflow.com/a/13988345/65863

String defaultEncoding = "UTF-8"; 
InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom); 
try { 
    BOMInputStream bOMInputStream = new BOMInputStream(inputStream); 
    ByteOrderMark bom = bOMInputStream.getBOM(); 
    String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); 
    InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName); 
    //use reader 
} finally { 
    inputStream.close(); 
} 
+0

真棒,那工作。只是爲了澄清一些事情,如果別人讀這個。創建'BomInputStream'就是刪除bom,你可以在這裏找到更多關於[here]的信息(https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/輸入/ BOMInputStream.html) – 2014-10-17 15:19:17