Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于验证http标头值的RegExp_Javascript_Http_Header_Xmlhttprequest - Fatal编程技术网

Javascript 用于验证http标头值的RegExp

Javascript 用于验证http标头值的RegExp,javascript,http,header,xmlhttprequest,Javascript,Http,Header,Xmlhttprequest,我正在向后端发送自定义标头: var oXhr = new XMLHttpRequest; oXhr.setRequestHeader("X-File-Name", fileName); 但如果fileName包含重音符号,例如,我会得到: SyntaxError:未能对“XMLHttpRequest”执行“setRequestHeader”: “é-December 3rd,2015.pdf”不是有效的HTTP标头字段值 我很难理解 编辑: 我意识到,尽管它看起来确实像口音,但却有些不同。这

我正在向后端发送自定义标头:

var oXhr = new XMLHttpRequest;
oXhr.setRequestHeader("X-File-Name", fileName);
但如果
fileName
包含重音符号,例如,我会得到:

SyntaxError:未能对“XMLHttpRequest”执行“setRequestHeader”: “é-December 3rd,2015.pdf”不是有效的HTTP标头字段值

我很难理解

编辑:

我意识到,尽管它看起来确实像口音,但却有些不同。这是一个人物:́


它的行为很奇怪(ascii码769),它混淆了我的浏览器控制台,甚至phpStorm。它会出现在下一个字符的顶部,不管发生什么,即使是粘贴时(试试看)。问题是,此头值的内容是用户从文件选择器中选择的文件名,并且此文件名包含此字符。过滤此类事件的最佳方法是什么?

应仅使用US-ASCII,如以下所述:

历史上,HTTP允许字段内容中包含文本 ISO-8859-1字符集[ISO-8859-1],仅支持其他字符集 通过使用[RFC2047]编码。实际上,大多数HTTP头 字段值仅使用US-ASCII字符集[USASCII]的子集。 新定义的标题字段应将其字段值限制为 US-ASCII八位字节。接受者应在现场治疗其他八位字节 内容(obs文本)为不透明数据

如果你尝试一些不受支持的字符

oXhr.setRequestHeader("X-File-Name", "Φ");
然后你得到

Uncaught DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 
'Φ' is not a valid HTTP header field value.
关键是说明书上说的

。。。仅通过使用[RFC2047]编码支持其他字符集

所以你需要像这样对值‘Φ’进行编码

oXhr.setRequestHeader("X-File-Name", "=?UTF-8?Q?=CE=A6?=");
在您的情况下,您需要在发送
文件名
之前使用或其他库对其进行编码

或者从文件名中删除任何不可打印的US-ASCII字符

filename.replace(/[^\x20-\x7E]+/g, '')

你能检查一下标题值是否用ISO-8859-1编码,而不是UTF-8或其他字符集编码吗?@Tobías你怎么检查?还有,我为什么要这样?我将utf8强制应用于我的整个系统application@sebas,HTTP不是utf-8协议,您需要传输ascii或ISO-8859-1,因此您需要在将文件名编码添加到请求头之前更改文件名编码,这是utf8字符,无效,服务器可能会拒绝您的HTTP消息(但在您的邮件发送之前,这里您就出现了一个错误)。谢谢。我通过直接捕获错误并将问题告知用户,最终筛选出了不符合格式的值。我将在将来设置编码系统,因为我的意思是接受用户给我的任何文件名。