当前位置: 首页 > 面试题库 >

如何处理包含非utf8字符的GET参数?

白星海
2023-03-14
问题内容

在基于nodejs / express的应用程序中,我需要处理GET请求,其中可能包含使用iso-8859-1字符集编码的变音符号。

不幸的是,它的querystring解析器似乎只能处理纯ASCII和UTF8:

> qs.parse('foo=bar&xyz=foo%20bar')
{ foo: 'bar', xyz: 'foo bar' } # works fine
> qs.parse('foo=bar&xyz=T%FCt%20T%FCt')
{ foo: 'bar', xyz: 'T%FCt%20T%FCt' } # iso-8859-1 breaks, should be "Tüt Tüt"
> qs.parse('foo=bar&xyz=m%C3%B6p')
{ foo: 'bar', xyz: 'möp' } # utf8 works fine

是否有隐藏的选项或其他干净的方法也可以与其他字符集一起使用?默认行为的主要问题是,我没有办法知道是否存在解码错误-毕竟,输入 本来可以
只是简单地解码为仍然看起来像urlencoded字符串的东西。


问题答案:

好的URL编码应该始终使用UTF-8,其他情况可以视为编码攻击,只是拒绝请求。没有非utf8字符。我不知道为什么您的应用程序可以获取任何编码的查询字符串,但是如果您仅在页面上使用字符集标头,那么使用浏览器就可以了。对于API请求或其他请求,您可以指定UTF-8并将无效的UTF-8拒绝为Bad
Request。

如果您真的是说ISO-8859-1,那么这非常简单,因为字节与unicode代码点完全匹配。

'T%FCt%20T%FCt'.replace( /%([a-f0-9]{2})/gi, function( f, m1 ) {
    return String.fromCharCode(parseInt(m1, 16));
});

虽然它可能永远不会是Web上的ISO-8859-1,但实际上是Windows-1252。



 类似资料:
  • 问题内容: 我有一些来自json文件的文本。在本文中,我应用了UTF8编码,但是该编码器无法识别非标准字符,并且为大写字符,是否有一种方法可以净化我的字符串? 我的功能: 问题答案: 我找到了解决方案。 UTF8采用8位表ASCII表,而UTF16采用16位ASCII表,解决方案很简单,只需将函数修改为:

  • 问题内容: 我需要一个可以告诉我字符串是否包含非字母数字字符的方法。 例如,如果字符串为“ abcdef?” 或“abcdefà”,该方法必须返回true。 问题答案: 使用Apache Commons Lang: 另一种方法是遍历String的字符并检查: 您还剩下一个问题:示例字符串“abcdefà”是字母数字,因为是字母。但我认为您希望将其视为非字母数字,对吗? 因此,您可能想使用正则表达式

  • 问题内容: 我的应用程序中有一个奇怪的异常,我想记录它发生的时间,并包括完整的请求字符串(包括参数)。 当我尝试 我得到了请求字符串,但没有得到包含的参数?和&。 例: 我只看到 我可以把整个字符串放在某个地方吗? 问题答案: 参见HttpServletRequest#getQueryString() 如果需要整个字符串,则必须将请求url和查询字符串附加在一起,因为没有方法可以获取整个字符串。

  • 问题内容: 在我的雪花数据库中,一个表具有非utf8字符。我如何在它上面创建仅包含utf8字符的视图;通过排除非utf8字符的行还是替换它们?谢谢 问题答案: 应该可以使用以下测试来检查非utf: 但是那时我没有数据可以测试。 要将字符串重新编码为utf-8,可以使用JavaScript函数:

  • 问题内容: 我有这个REST资源: 例如,param可以包含斜杠字符:。 很明显,我在用它来调用它,但是不起作用。 我也尝试过使用,将斜杠编码为,但也不起作用,它也不会到达端点。 编辑 我正在使用Retrofit来调用端点,并且这样做: 使用,但仍然无法正常工作。 问题答案: 保留字符(例如和)必须经过URL编码。 编码为 编码为 尝试。 在RFC 3986个 定义了以下一组保留的字符可被用作分隔

  • 问题内容: 我想将GET参数添加到可能不包含GET参数的URL中,而无需重复或。 例: 如果我要添加 如果您发现发现的问题,我会尽量不重复问号。 URL只是一个字符串。 附加特定GET参数的可靠方法是什么? 问题答案: 基本方法 更先进 如果不是类,则应至少将其放在函数中。