Python 浏览器字符设置优先顺序

Python 浏览器字符设置优先顺序,python,html,character-encoding,Python,Html,Character Encoding,客户端浏览器正在发送头HTTP\u ACCEPT\u字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3。我只提供带有正确标题的utf8网页,但浏览器发布的数据来自使用ISO-8859-1字符集编码的表单。我的问题是,浏览器是否总是按照ACCEPT_字符集头的顺序选择字符集,这样我就可以可靠地编写一个中间件,用第一个条目(在本例中为ISO-8859-1)解码任何发布的数据,并将其编码为utf8 更新: 我用accept charset=“utf-8”更新了表单标记,但仍然看到非u

客户端浏览器正在发送头
HTTP\u ACCEPT\u字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
。我只提供带有正确标题的utf8网页,但浏览器发布的数据来自使用ISO-8859-1字符集编码的表单。我的问题是,浏览器是否总是按照ACCEPT_字符集头的顺序选择字符集,这样我就可以可靠地编写一个中间件,用第一个条目(在本例中为ISO-8859-1)解码任何发布的数据,并将其编码为utf8

更新:


我用
accept charset=“utf-8”
更新了表单标记,但仍然看到非unicode字符出现。用户从其他地方(lastpass、excel文件)复制/粘贴其密码是否可能会注入非unicode字符?

我不确定是否所有浏览器都喜欢以相同的特定顺序使用字符集,但您可以在表单中设置accept字符集,这会迫使浏览器发送utf-8编码的数据

像这样:

<form accept-charset="utf-8"></form>

请求头
Accept Charset
(可能映射到服务器端的
HTTP\u Accept\u Charset
表示客户端的首选项,当服务器能够以不同的编码为资源提供服务时使用。服务器可能会忽略它,而且通常会忽略

如果页面采用UTF-8编码并声明为UTF-8编码,则页面上的任何表单都将以UTF-8编码的形式发送其数据,除非指定
accept charset
属性。因此,如果浏览器以ISO-8859-1编码方式发布数据,则这是一个浏览器错误。然而,在得出结论之前,需要对此进行分析


有一种ald技术,它包含一些特殊字符,为了安全起见使用字符引用编写,作为隐藏字段的值。然后,服务器端处理程序可以提取该字段的值并检测编码不匹配,甚至可以从特殊字符的编码形式启发式地推断出实际编码。

因此,我猜浏览器有一个bug。它肯定不是以UTF8的形式发布数据。我添加了accept字符集,如果我只是在出错时使用浏览器的HTTP_accept_字符集作为指针,我会得到一致的结果。如果在多个浏览器中发生这种情况,可能会有不同的解释。您是否有或者可以构建一个公共页面URL来演示这个问题?我无法重建它。浏览器倾向于发送您提到的接受字符集头,即使页面本身和表单数据传输是UTF-8。标题取决于它们的配置,而不是页面。我怀疑可能有某个软件组件(服务器端)在数据到达您的代码之前执行代码转换。我在Mac上运行,这个问题似乎特别与windows用户输入的字符有关,这些字符随后被编码到扩展ascii字符集中,如“E”带有一个被编码为\xC9的尖锐重音,当它在服务器上被盲目地视为unicode时会出错。这会处理通过
包含的文件中的数据吗?这将解释很多…浏览器通常按原样发送文件内容,而不指示字符编码。如果您有一个UTF-8编码的表单,并且该表单用于提交windows-1252编码的纯文本文件,那么它的内容将被发送,声明为text/plain(无字符集),即使普通字段的内容是UTF-8编码的。坏消息是,一般来说,浏览器无法识别编码,因此它既不能声明编码,也不能对数据进行代码转换,而事实并非如此。任何地方都没有文件上传。这应该可以工作,但我已经有了4天的更改,我仍然收到错误。