2015-04-16 40 views
0

比方說,我有這個輸入一個文件:DecoderFallbackException麻煩正確的字符

「奶油甜甜圈,$ 1.00」

如果用戶上傳錯誤編碼爲ANSI文件和我解析它使用帶有UTF8編碼集的TextFieldParser()在無效字節上引發異常時,它將正確地通過異常。它會報告:

「無法將索引321中的字節[E8]從指定的代碼頁轉換爲Unicode。」

屬性「UnknownBytes」包含帶有單個條目[232]的字節數組。 232是E8的十進制等值。奇怪的是,我相信「è」應該是字節[2] {195,168}。

我想回報給用戶什麼字符造成的差異。

這樣做的最好方法是什麼?

如果我返回Encoding.UTF8.GetString(ex.UnknownBytes),它將返回Unicode替換字符而不是「è」。推測這是因爲「232」作爲單個字節是無效的。

我錯過了什麼?看起來我擁有所有需要幫助用戶的信息,但我無法進行溝通。

回答

1

我看到了問題。在我的例子中,我使用「è」作爲外來字符。這是ANSI中的\ xE8,而UTF8中的\ xC3 \ xA8。如果我試圖渲染UTF8中的\ xE8,或者我相信任何Unicode編碼,它就不知道我在問什麼,因爲\ xE8對於代碼點U + 00E8來說不是一個有效的十六進制值。

我結束了使用下面的代碼將工作爲我的情況給我的服務器我的區域設置:

catch (DecoderFallbackException ex) 
{ 
    var ansiEncoding = Encoding.Default; 

    var ansiOutput = ansiEncoding.GetString(ex.BytesUnknown); 

    throw new PageException("This file contains unexpected characters. The following character was found in the file: " + ansiOutput); 
} 
+0

哎喲爲downvote。我認爲這對試圖理解在編碼異常中返回的字節數組含義的人有幫助。我強調我的回答在我的情況下適用於上述情況,因爲我的上下文中的Encoding.Default是Windows代碼頁1252,並且上傳到我的平臺的值很可能來自相同的代碼頁,因此我可以輸出一個可識別的值給最終用戶。因人而異。 – DuncanMack

+0

我提高了你的答案,因爲我覺得你不配。但是,您的解決方案不是解決方案,它只能幫助調試(請參閱有問題的字符串)。 –