2016-12-01 23 views
0

當您在Gmail中的HTML電子郵件中的某一行中鍵入兩個空格時,如果您查看電子郵件的來源,它會將其編碼到quoted-printable正文中,如「= C2 = A0」 。在Golang中解碼引用打印的電子郵件

因爲UTF-8編碼解碼時,這應該轉換爲00A0(NBSP)。根據該計算器的答案,:https://stackoverflow.com/a/2774507

然而,在Golang,這不是它的工作原理:

s := `Text Text Text.=C2=A0 That's just two spaces` 

r := strings.NewReader(s) 

qpReader := quotedprintable.NewReader(r) 

all, _ := ioutil.ReadAll(qpReader) 

str := string(all) 

fmt.Println(strings.Index(str, "\xC2\xA0")) 

這個輸出「15」,這裏的遊樂場鏈接:https://play.golang.org/p/8n6L7dlZPt

而不是它使用NBSP那裏,它將保持\ XC2,並導致「文本文本TEXTA這只是兩個空格」。

什麼是最好的方式來正確呈現這\ x00A0?

+0

一切都很好。您應該閱讀更多關於Unicode的內容,並以UTF-8表示。你想要一個不可破解的空間U + 00A0,你得到一個,因爲U + 00A0是_encoded_ _as_ UTF-8是字節序列0xC2A0(不是「已翻譯」)。一切都很好,引用的打印工作正常,你有你的nbsp。添加一個'fmt.Println(str)'並檢查Playground中的輸出,它會呈現一個  HTML實體,因爲你有一個nbsp。閱讀https://blog.golang.org/strings和谷歌的「絕對最低限度每個軟件開發人員絕對積極必須瞭解Unicode和字符集」。 – Volker

+0

順便說一句:「正確渲染爲\ x00A0的最佳方法是什麼?」最可能的是_wrong_ _question_。 U + 00A0是unicode代碼點(In Go - 說一個「符文」,一個抽象字符),並且您希望以任何UTF-8編碼字符串將此符文編碼爲0xC2A0。包unicode/utf8有助於將符文從/轉換爲代碼點,如果你真的需要(你不)。 – Volker

+0

謝謝大家,非常有幫助。在我的應用的下一個步驟中發現服務缺乏對UTF的支持,這只是一個紅鯡魚。 –

回答

0

正如Volker在他的評論中解釋的,Go字符串只是一個字節片段。就你而言,它已經被編碼爲Go的默認編碼UTF-8。其中要使其

// Prints 15. 
fmt.Println(strings.IndexRune(str, '\xA0')) 

// Prints A0. 
fmt.Printf("%X\n", []rune(str)[15]); 

如何正確地呈現字符串取決於:要訪問實際的Unicode代碼點(符文在Go行話),使用類似。但在大多數情況下,您可以按原樣傳遞它,因爲它已經在UTF-8中。