2012-04-30 81 views
7

我正在維護的應用程序使用'latin1'字符集將從Web日誌中提取的用戶代理加載到MySQL表列中。偶爾,它無法加載,看起來像這樣用戶代理:我懷疑這是窒息Iâ?是否在HTTP標頭中合法使用unicode用戶代理?

Mozilla/5.0 (Iâ?; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML^C like Gecko) Version

。我正在努力弄清楚這是否應該得到支持,或者它是否由上游記錄系統引入了腐敗。這是HTTP頭中的合法用戶代理嗎?

+0

HTTP規範早於Unicode。我確定我看到一些建議說輸出ASCII,但接受UTF-8。但我不記得我在哪裏看到的,這就是爲什麼這是一個評論,而不是一個答案。 – TRiG

+0

@TRiG:聽起來像[魯棒性原則]的特定實例(http://en.wikipedia.org/wiki/Robustness_principle)。 – eggyal

+2

一般來說,嘗試將任意數據存儲爲Latin-1可能是一個糟糕的主意,除非您可以保證您只能獲得可以符合Latin-1字符集的輸入。你爲什麼不使用UTF-8? – geoffspear

回答

13

RFC 2616(HTTP 1.1)says該消息頭部內容必須「由......組成令牌,分離器,和引用字符串的任*TEXT或組合的」。如果你看TEXT等的definitions,你會發現合法的字符是那些字節值不在[0,31]範圍內而不等於127的字符;因此像â這樣的字符就我所知道的規範而言是合法的。

+0

TEXT實際上*不允許八位位組> 127: TEXT = <除CTL外的任何OCTET, 但包括LWS> –

+0

@JulianReschke:Ouch。應該教我不要太快閱讀......我已經糾正了答案;謝謝你的收穫。 – Jon

2

HTTP 1.1 RFC2616是指ISO-8859-1,它是一個基於拉丁語的單字節字符集。

考慮到HTTP流量是應該是單字節,我也使用latin1字符集爲我的類似日誌。這個決定只是爲了讓我的索引更小。

如果您使用帶有VARCHAR的UTF8,則只有多字節字符需要額外的字節,所以在表空間中,它並不多。但是,索引存儲爲固定寬度,因此,它們會填充空格以防萬一需要(UTF8索引是latin1索引的三倍)。

如果偶爾奇數標題不可讀,它不會影響我。但是,如果你不索引列,你可以使用UTF8。

3

從技術上講,八位位組>> 127允許在註釋中。 RFC 2616使得它們默認爲ISO-8859-1,但HTTPbis(即將發佈的RFC 2616修訂版)已經刪除了該規則,因此有時在不久的將來,我們可能會轉向一種理智的編碼。

推薦:去掉所有八位字節> 127.

+0

爲什麼downvote?實際上,爲了明智的建議+1。 – hakre

相關問題