不同浏览器之间的xhtml特殊字符
xhtml special characters between different browsers
我正在开发一个 cgi 程序,我收到一个这样的电子邮件地址:someone@site.com 并将其存储在一个文件中。
但是发生了一些奇怪的事情。当我使用 IE 时,'@' 字符不会改变并且在文件中是相同的,但是当我使用 chrome 时,'@' 字符会更改为 %40 并且是检索 '@ 的唯一方法' 是找到 %40 并将其替换为 '@'。我是编码错误还是 chrome 有问题?
更好地理解:
即:某人@site.com
Chrome:someone%40site.com
并且当我将信息发送回浏览器时,%40 不会更改为@
实际上是 IE 做错了 - 您需要将 %xx 代码改回字符。在 %40 的情况下,这将是 ASCII 码。 0x40 == 64 == '@'。但是,您不能指望它是 ASCII,因为 unicode 字符(例如重音字母)也将被类似地编码。
大多数语言,如 PHP 和 Python 都有一个辅助函数来编码和解码这些语言(PHP 称为 url_encode() 和 url_decode()) - 我很长一段时间没有在 C++ 上使用 CGI,所以不确定是否有现成的助手,或者你是否必须自己编写代码 - 无论哪种方式,你都应该准备好解码 url 编码的字符串,因为所有浏览器都会对某些字符执行此操作(如果不是全部)(例如,%20 而不是 space 很常见)。
希望对您有所帮助!
上面的答案是正确的,只是为了使主题更丰富我认为这段代码的和平可以成为您使用的功能:
int main()
{
int number;
string dataString="hi %40 c++ programmer %40 !";
string transform;
istringstream input;
string::size_type location = dataString.find("%");
while (location <string::npos)
{
transform = dataString.substr(location+1, 2);
input.str(transform);
input >> hex >> number;
dataString.replace(location,3,1,static_cast<char>(number));
location = dataString.find("%", location+1);
}
cout << dataString << endl;
}
我正在开发一个 cgi 程序,我收到一个这样的电子邮件地址:someone@site.com 并将其存储在一个文件中。 但是发生了一些奇怪的事情。当我使用 IE 时,'@' 字符不会改变并且在文件中是相同的,但是当我使用 chrome 时,'@' 字符会更改为 %40 并且是检索 '@ 的唯一方法' 是找到 %40 并将其替换为 '@'。我是编码错误还是 chrome 有问题?
更好地理解: 即:某人@site.com Chrome:someone%40site.com
并且当我将信息发送回浏览器时,%40 不会更改为@
实际上是 IE 做错了 - 您需要将 %xx 代码改回字符。在 %40 的情况下,这将是 ASCII 码。 0x40 == 64 == '@'。但是,您不能指望它是 ASCII,因为 unicode 字符(例如重音字母)也将被类似地编码。
大多数语言,如 PHP 和 Python 都有一个辅助函数来编码和解码这些语言(PHP 称为 url_encode() 和 url_decode()) - 我很长一段时间没有在 C++ 上使用 CGI,所以不确定是否有现成的助手,或者你是否必须自己编写代码 - 无论哪种方式,你都应该准备好解码 url 编码的字符串,因为所有浏览器都会对某些字符执行此操作(如果不是全部)(例如,%20 而不是 space 很常见)。
希望对您有所帮助!
上面的答案是正确的,只是为了使主题更丰富我认为这段代码的和平可以成为您使用的功能:
int main()
{
int number;
string dataString="hi %40 c++ programmer %40 !";
string transform;
istringstream input;
string::size_type location = dataString.find("%");
while (location <string::npos)
{
transform = dataString.substr(location+1, 2);
input.str(transform);
input >> hex >> number;
dataString.replace(location,3,1,static_cast<char>(number));
location = dataString.find("%", location+1);
}
cout << dataString << endl;
}