2010-07-20 56 views
4

我正在從郵箱中拖拉法語電子郵件,並且電子郵件中包含重音符號。我相信它使用的是UTF8編碼。C#中的UTF8(引用可打印)轉換問題

我已經嘗試了不同的UTF8轉換方法,我在互聯網上發現,但一直不成功。

如何,例如,在C#中,我轉換這一點:蒙特婁= C3 = A9al到蒙特利爾?

編輯:此外,它是不一致的。有時它可能像Montr & eacute; al。 (&符號後面的空格只是添加的,所以瀏覽器不會將其轉換。)

Thanks! Mark

回答

3

這不是UTF-8。這是quoted printable,它與UTF-8編碼不同,它更像是「ASCII文本到Unicode文本」編碼。

Quoted printable將有效地允許您將ASCII消息轉換爲一個字節數組,它可以將然後解碼爲UTF-8。

我不知道是否有.NET中的引用可打印的編碼,這是有點怪異......我可能已經錯過了任何東西直接支持。

+0

我不這麼認爲。當我從QP轉換時,得到: Montréal。 它將每個= C3和= A9作爲一個獨立的實體。但是,他們需要一起解釋才能獲得é。 – user390480 2010-07-20 13:33:09

+2

@ user390480:這表明你沒有正確轉換QP。您需要從QP轉換爲二進制,然後*然後*使用UTF-8編碼將該二進制文件解碼爲文本。 – 2010-07-20 14:12:53

+1

@JonSkeet,我有同樣的問題[這裏](http://stackoverflow.com/q/32083334/7850)。你有可能發佈如何從QP轉換的代碼示例嗎?謝謝! – 2015-08-18 22:38:11

2

的UTF-8編碼轉換字節(8位數字)的陣列以一個字符串(或反之亦然)。即有「數字」和「字符」之間的映射。該字符集大於ASCII字符集,例如é是UTF-8的一部分,但不是ASCII的一部分。

引用-Prinable編碼轉換字節(8位數)的ASCII字符的序列(實際上它的一個子集)的陣列。

因此,兩個可以「編碼」一UTF-8字符串組合成的ASCII字符(的一個子集)(ASCII字符串)的序列。

使用其他編碼(例如ISO-8859-1)也可以做到這一點。因此,你需要有兩個信息:

  • 給定的ASCII字符串是引用的可打印
  • 生成的字節數組表示一個字符串,其編碼爲UTF-8

解碼引用可打印因此具有兩個步驟:

  1. 創建字節數組說字節[]通過引用的可打印的規則,即

    • 子串= NM映射到字節NM(其中NM是十六進制)(「N * 16 + M」)
    • 任何其他字符映射到其ASCII字節 (注意,類似的q-編碼字具有額外映射到_空間)
  2. 然後將字節數組解釋爲UTF-8字符串。