【问题标题】:Urlencoding weird characters in another charset在另一个字符集中对奇怪的字符进行 Urlencoding
【发布时间】:2014-11-25 05:33:30
【问题描述】:

我正在学习 C,我正在使用 libcURL 发送 POST 请求以登录网站。
我偶然发现了一个问题,我的密码包含ü 字符。
从我的浏览器读取 POST 请求,我可以看到它被编码为 %FC
但是,当使用curl_easy_escape()对其进行编码时,它会编码为%C3%BC

我去搜索了,发现它是一种不同的编码。我认为是 ISO,因为页面有这个元:<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
但是,我无法弄清楚如何以某种方式对其进行转换。

现在,我将如何进行 urlencoding üas %FC

【问题讨论】:

  • @HansPassant 为什么我需要更改语言环境?那不只影响多语言程序的输出吗?
  • 可能值得在 libcurl 标签上发布一个单独的问题,询问准备用于 POST 的字符串的正确/惯用方式。由于这是每个人都需要的东西,所以肯定有一个标准答案。可能发生的最坏情况是您发现标准解决方案是curl_easy_escape,并且您应该在将字符串传递给此函数之前自己进行字符集转换。
  • @R.. 通常,如果有an example from the library itself,我认为这应该是处理它的正确/惯用方式。

标签: c encoding character-encoding libcurl iso


【解决方案1】:

在 POST 中使用非 UTF-8 编码是一团糟,而且浏览器之间的行为实际上差异很大,因此这样做被认为是非常糟糕的做法。但既然你被一个网站所困,你就必须解决它。

我找不到用于使用备用字符集进行百分比编码的 curl api,因此您可能必须自己做(首先使用 iconv 从系统的本机编码(希望是 UTF-8)转换为 ISO-8859- 1(Latin-1),然后手动进行百分比编码)。

一个想法 - 你确定你甚至应该自己逃跑吗?我的印象是它只适用于 URL,用于 POST 表单的 curl API 可能已经在内部进行转义(不确定),在这种情况下,您可能只需要告诉它正确的内容类型。

【讨论】:

  • 在 libcURL 中,您只需在 CURLOPT_POSTFIELDS 中放入一个字符串。它对它没有任何作用。 iconv 似乎是一种可行的方式,我会尝试的。我的程序将使用命令行参数作为密码,我应该担心所述参数的编码吗?
  • @mid_kid:通常礼貌的做法是将来自命令行、用户提供的文本文件、环境变量等的任何内容视为在区域设置的编码中编码。这需要调用 setlocale(LC_CTYPE, "") 或类似方法以确保遵循区域设置并使用 nl_langinfo(CODESET) 获取区域设置编码的名称(然后您可以将其传递给 iconv_open)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2021-12-13
  • 2013-03-17
  • 2021-01-20
  • 2019-06-14
相关资源
最近更新 更多