2017-08-01 54 views
-1

我在程序中寫入的磁盤上有一個文件,其中一些數據是用Json編碼的。使用UTF-7忽略+字符的File.ReadAllText

我使用C#的File.ReadAllText(字符串路徑,編碼編碼)稍後閱讀它。由於不相關的原因,我們必須使用UTF-7。

我們的線路則是這樣的:

var content = File.ReadAllText(fileName, Encoding.UTF7); 

它工作正常,然後寫讀書,對於基本上我們所需要的一切。唯一的例外是加號(+)。如果我們的文件中有+符號,這段代碼將返回整個字符串,忽略所有這些字符串。所以

{ "commandValue": "testvalue + otherValue" } 

變成

{ "commandValue": "testvalue otherValue" } 

我已籤文件的字節,而+號確實是焦炭0x2B訪問,這是UTF-7的正確的漢字(也在UTF相同字符-8,不知道是否重要)。

我不明白爲什麼他們在閱讀時會消失。

對於測試的緣故,我曾嘗試與

var content = File.ReadAllText(fileName, Encoding.UTF8); 

讀它,它工作得很好。 chars沒有消失。

我可能會做錯什麼,我怎麼能使File.ReadAllText(fileName,Encoding.UTF7)不忽略這些字符?

截至目前,我還沒有發現另一個字符有這個問題,但我顯然沒有測試所有這些。

+0

你確定這個文件已經保存在utf上而不是unicode中嗎? – Gusman

+0

'+'是UTF7中用來表示轉義序列的特殊字符。對@古斯曼來說,字符串可能不是使用UTF7編碼編寫的。當你以UTF7讀取它時,該'+'被視爲轉義序列的開始,但是沒有遇到有效的序列,所以UTF7編碼器只是'吃''+'。如果在文件中的每個加號之後加上' - ',UTF7解碼將正常工作(即所有的「+」變成「+ - 」)......至少對於這些加號來說。但主要問題是,字符串未使用UTF7編碼器寫入文件。 – wablab

+0

@wablab我知道,這就是爲什麼我問... – Gusman

回答

2

該文件未使用UTF7編寫。 '+'是UTF7編碼方案中的一個特殊字符,用於表示「修改後的base64」序列的開始。所以,當文件被讀取爲UTF7時,解碼器看到'+',期望修改後的base64序列(但沒有找到),然後像往常一樣繼續解碼文件。作爲結果,輸出「+」被抑制。

要解決您遇到的問題,您可以嘗試將文件作爲UTF8讀取,或者可以更新寫入文件的代碼以確保它使用UTF7編碼。

+0

我建議在你的評論中加入關於「+ - 」序列的一點。考慮到每個從事寫入和讀取部分工作的人都正在度假,我無法弄清楚他們爲什麼選擇這些編碼進行讀寫,並且在不知道影響的全部範圍的情況下不會改變它。暫時,我已經使用「+ - 」方法作爲此用戶的佔位符,直到我可以獲得所需的輸入。 –