在HTTP标头内是unicode用户代理合法吗?

时间:2012-04-30 13:45:20

标签: mysql http user-agent

我正在维护的应用程序使用'latin1'字符集将从Web日志中提取的用户代理加载到MySQL表列中。有时,它无法加载看起来像这样的用户代理:

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

我怀疑它在Iâ?上窒息。我正在努力弄清楚是否应该支持它,或者它是否是上游日志记录系统引入的损坏。这是HTTP标头中的合法用户代理吗?

3 个答案:

答案 0 :(得分:13)

RFC 2616(HTTP 1.1)says邮件标题内容必须“由*TEXT或标记,分隔符和引用字符串”的组合组成。如果您查看TEXT等的definitions,您会发现合法字符是字节值不在[0,31]范围内且不等于127的字符;因此,根据规范,â这样的字符就我所说的合法​​。

答案 1 :(得分:4)

技术上,八位字节>评论中允许使用127条。 RFC 2616使它们默认为ISO-8859-1,但HTTPbis(即将发布的RFC 2616版本)已经删除了该规则,因此有时在遥远的未来,我们可能会转向合理的编码。

建议:剥离所有八位字节> 127。

答案 2 :(得分:2)

HTTP 1.1 RFC2616是指ISO-8859-1,它是一种基于拉丁语的单字节字符集。

考虑到HTTP流量应该是单字节,我也使用latin1字符集作为我的类似日志。决定只是让我的索引更小。

如果将UTF8与VARCHAR一起使用,则只有多字节的字符需要额外的字节,所以在表空间中,它并不多。但是,索引是固定宽度存储的,因此,只要你需要它们,它们就会用空格填充(UTF8索引是latin1索引的三倍)。

如果偶尔的奇数标题不可读,它不会影响我。但是,如果您没有为列编制索引,也可以使用UTF8。