Facebook字符集检测机制?

6
今天,我查看了Facebook.com的HTML代码,并发现了以下内容:
<input type="hidden" value="€,´,€,´,水,Д,Є" name="charset_test"/>

这段代码在 <form>...</form> 中重复了两次。

你有什么想法,这段代码可能有什么用处 - 一种服务器端客户端字符集检测?据我所知,浏览器字符集已经在HTTP请求中传输(一个“Accept-Charset”头)。

4个回答

4
有没有想法这段代码可能有什么用处 - 一种服务器端客户端字符集检测?
显然是的。
欧元符号在字符集检测中很有用,因为有许多编码方式:
- UTF-8 中的 E2 82 AC - windows-1251 中的 88 - 其他 windows-125x 编码中的 80 - ISO-8859-7、-15 和 -16 中的 A4 - GB18030 中的 A2 E3 - Shift-JIS 中的 85 40 - 等等。
据我所知,浏览器字符集在 HTTP 请求中已经被传输(一个“Accept-Charset”头)。
它应该在 HTTP Content-Type 头中传输,但这并不意味着用户代理实际上能够正确获取它。

3

我猜他们在接收脚本中进行匹配,以确保客户端正确编码为UTF-8发送请求,甚至可能会根据他们所期望的字符来检测实际编码。

如果我没记错的话 - 我曾经处理过这个问题 - 在某些情况下,IE6 中存在表单编码问题。


谢谢,我会去谷歌一下这个与IE6有关的表单问题。 - Void
我可能错了,但我认为这与编码不明确有关(即当“content-type”标头与“content-type” META标记不同时)。无论如何,我认为Facebook这样做是因为他们被各种客户端访问,他们需要确保他们的编码通常是正确的。 - Pekka

0
&euro;,&acute;,€,´,水,Д,Є

我猜测有些浏览器发送的 &euro; 以及 &acute;´ 是相同的,

因此他们可以检查 charset_test[0] == charset_test[2] 和 charset_test[1] == charset_test[3]

至于其他字符,我不清楚。水可能是用来测试CJK的。


0
正如Pekka所说,这是为了能够检测请求字符集。HTTP协议没有提供指定请求字符集的方法。因此,人们必须依赖于协议之外的约定。通常浏览器是可预测的,但这个技巧是唯一可以100%确定的方法。
另请参阅:http://www.phpwact.org/php/i18n/charsets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接