url编码字符串(代码值推荐项目) [英] url encoding string (Code Worth Recommending Project)

查看:45
本文介绍了url编码字符串(代码值推荐项目)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

encodeURIComponent通常用于序列化与

XMLHttpRequest请求一起使用的表单。为了完美模拟浏览器表单

请求,目标是在< URL:

http://www.w3.org/TR/中序列化表单数据1999 / REC-html401-19991224 / interact / forms.html#h-17.13.4.1>

application / x-www-form-urlencoded< / astandardized format。

encodeURIComponent()对空格的处理与x-www-form-urlencoded标准的

不同。根据x-www-form-

urlencoded标准,空格应编码为+。和换行符

应编码为%0D%0A。


JavaScript encodeURIComponent函数将空格编码为%20。

在Windows操作系统上,新行被编码为%0D%0A。但是在Mac OS X上,新行被编码为%0A。我不知道

Linux。有人可以在表单中使用textarea进行检查吗?


某些开发人员可能需要使用application / x-www-form-urlencoded

格式。我们可以包装encodeURIComponent。


if(typeof encodeURIComponent!=''undefined''&&

String.prototype.replace){


var urlEncode = function(s){

返回encodeURIComponent(s).replace(/%20 /,''+'')。replace(/(。

{0,3})(%0A)/ g,

函数(m,p1,p2){return p1 +(p1 ==''%0D'' ?'''':''%0D'')+ p2;});

};

})();


}


String.prototype.replace的功能检测是不够的

因为我们真的需要知道替换的第二个参数是否可以

是一个功能。我想我们可以通过使用try-catch和

来测试这个实际上使用replace作为第二个参数的函数。

有人知道如何在不使用try-catch的情况下进行检查吗?

对于具有服务器端工具包能够处理

输出的开发人员encodeURIComponent的正则表达式工作不是必需的,可以使用这个简单的小函数来支持



if(typeof encodeURIComponent!=''undefined''){


var urlEncode = function(s){

return encodeURIComponent(s);

};


}

甚至可能有一个没有textareas的表格版本所以只需要

空格需要更换。


if(typeof encodeURIComponent!=''undefined''&&

String.prototype.replace){


var urlEncode = function(s ){

返回encodeURIComponent(s).replace(/%20 /,''+'');

};

}) ();


}


--------------


BTW,我为代码设置了svn / trac并发布了getOptionVa lue代码

由表格序列化的前一个帖子产生。


< URL:http://cljs.michaux.ca/trac/browser/ trunk / src / getOptionValue>


评论权限,请给我发电子邮件。如果你有一个用户名/密码,请告诉我

首选项。


彼得

解决方案

Peter Michaux写道:


在Windows操作系统上,新行被编码为%0D%0A。但是在Mac OS X上,新行被编码为%0A。我不知道

Linux。有人可以在表单中使用textarea进行检查吗?



与Windows相同:%0D%0A之后


Linux xxxx 2.6 .17-12-generic#2 SMP Sun Sep 23 22:56:28 UTC 2007 i686

GNU / Linux


Peter Michaux写道:


JavaScript encodeURIComponent函数将空格编码为%20。

在Windows操作系统上,新行编码为 %0D 0A%"但是在Mac OS X上,新行被编码为%0A。我不知道

Linux。有人可以在表单中使用textarea进行检查吗?



是但是%0A只是因为Mac OSX是UNIX衍生物(

历来总是使用%0A)。


Mac直到OS9应该返回%0D。
http://en.wikipedia.org/wiki/Line_Feed


%0A:Multics,Unix和类Unix系统(GNU / Linux,AIX ,Xenix,Mac

OS X等),BeOS,Amiga,RISC OS等

%0D%0A:DEC RT-11和大多数其他早期非-Unix,非IBM操作系统,CP / M,

MP / M,MS-DOS,OS / 2,Microsoft Windows

%0D:Commodore机器,Apple II家庭和Mac OS最高版本9


-

巴特


11月21日,上午1:44,Bart Van der Donck< b ... @nijlen.comwrote:


Peter Michaux写道:


JavaScript encodeURIComponent函数将空格编码为%2 0>

在Windows操作系统上,新行被编码为%0D%0A。但是在Mac OS X上,新行被编码为%0A。我不知道

Linux。有人可以在表单中使用textarea进行检查吗?



是但是%0A仅仅是因为Mac OSX是UNIX衍生物(

历史上总是使用%0A)。


Mac直到OS9应该返回%0D。
http://en.wikipedia.org/wiki/Line_Feed


%0A:Multics,Unix和类Unix系统(GNU / Linux,AIX ,Xenix,Mac

OS X等),BeOS,Amiga,RISC OS等

%0D%0A:DEC RT-11和大多数其他早期非-Unix,非IBM操作系统,CP / M,

MP / M,MS-DOS,OS / 2,Microsoft Windows

%0D:Commodore机器,Apple II家庭和Mac OS最高版本9



感谢pr和Bart。似乎需要更正两个选项('%0D''和''%0A'')

。怎么样?


var urlencode =(function(){


var f = function(s){

返回encodeURIComponent(s).replace(/%20 /,

''+'')。replace(/(。{0,3})(%0A)/ g,

函数(m,p1,p2){return p1 +(p1 ==''%0D''?'''':''%0D'')+ p2;}

).replace(/(%0D)(。{0,3})/ g,

函数(m,p1,p2){return p1 +(p2 ==''%0A' '?'''':''%0A'')+ p2;});

};


试试{

if(f(''\ n \ r'')==''%0D%0A +%0D%0A''){

返回f;

}

}

catch(e){}


})();

使用try-catch是避免主机对象功能测试的好方法,并且确保正则表达式的所有必要部分都符合预期的b / b
。这样就可以在非常小的
空间内对新功能进行全面测试。


但是,try-catch并不会吸引一些程序员。测试替换的任何其他

选项可以用于第二个

参数的函数吗?


Peter


encodeURIComponent is commonly used to serialize forms for use with
XMLHttpRequest requests. For a perfect simulation of browser form
requests, the goal is to serialize form data in the <URL:
http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.13.4.1>
application/x-www-form-urlencoded</astandardized format.

The handling of whitespace by encodeURIComponent() is different from
the x-www-form-urlencoded standard. According to the x-www-form-
urlencoded standard, a space should be encoded as a "+" and a newline
should be encoded as a "%0D%0A".

The JavaScript encodeURIComponent function encodes a space as "%20".
On Windows operating system a new line is encoded as "%0D%0A" but on
Mac OS X a new line is encoded as just "%0A". I don''t know about
Linux. Can someone check using a textarea in a form?

Some developers may need to have the application/x-www-form-urlencoded
format. We can wrap encodeURIComponent.

if (typeof encodeURIComponent != ''undefined'' &&
String.prototype.replace) {

var urlEncode = function(s) {
return encodeURIComponent(s).replace(/%20/, ''+'').replace(/(.
{0,3})(%0A)/g,
function(m, p1, p2) {return p1+(p1==''%0D''?'''':''%0D'')+p2;});
};
})();

}

The feature detection for String.prototype.replace is not sufficient
because we really need to know if the second argument to replace can
be a function. I imagine we can test this by using try-catch and
actually using replace with a function as the second argument. Does
anyone know a way to check without using try-catch?
For developers with server-side toolkits capable of dealing with the
output of encodeURIComponent the regexp work is not necessary and can
use just this simple little function.

if (typeof encodeURIComponent != ''undefined'') {

var urlEncode = function(s) {
return encodeURIComponent(s);
};

}
There could even be a version for forms without textareas so only the
spaces need replacement.

if (typeof encodeURIComponent != ''undefined'' &&
String.prototype.replace) {

var urlEncode = function(s) {
return encodeURIComponent(s).replace(/%20/, ''+'');
};
})();

}

--------------

BTW, I set up svn/trac for the code and posted the getOptionValue code
that resulted from the previous thread on form serialization.

<URL: http://cljs.michaux.ca/trac/browser/trunk/src/getOptionValue>

Please email me if you would like wiki editing and ticket creation/
commenting permissions. Let me know if you have a username/password
preference.

Peter

解决方案

Peter Michaux wrote:

On Windows operating system a new line is encoded as "%0D%0A" but on
Mac OS X a new line is encoded as just "%0A". I don''t know about
Linux. Can someone check using a textarea in a form?

Same as Windows: before%0D%0Aafter

Linux xxxx 2.6.17-12-generic #2 SMP Sun Sep 23 22:56:28 UTC 2007 i686
GNU/Linux


Peter Michaux wrote:

The JavaScript encodeURIComponent function encodes a space as "%20".
On Windows operating system a new line is encoded as "%0D%0A" but on
Mac OS X a new line is encoded as just "%0A". I don''t know about
Linux. Can someone check using a textarea in a form?

Yes but %0A is only because Mac OSX is a UNIX derivate (which
historically always used %0A).

Mac until OS9 should return %0D.

http://en.wikipedia.org/wiki/Line_Feed

%0A: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac
OS X, etc.), BeOS, Amiga, RISC OS, and others
%0D%0A: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M,
MP/M, MS-DOS, OS/2, Microsoft Windows
%0D: Commodore machines, Apple II family and Mac OS up to version 9

--
Bart


On Nov 21, 1:44 am, Bart Van der Donck <b...@nijlen.comwrote:

Peter Michaux wrote:

The JavaScript encodeURIComponent function encodes a space as "%20".
On Windows operating system a new line is encoded as "%0D%0A" but on
Mac OS X a new line is encoded as just "%0A". I don''t know about
Linux. Can someone check using a textarea in a form?


Yes but %0A is only because Mac OSX is a UNIX derivate (which
historically always used %0A).

Mac until OS9 should return %0D.

http://en.wikipedia.org/wiki/Line_Feed

%0A: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac
OS X, etc.), BeOS, Amiga, RISC OS, and others
%0D%0A: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M,
MP/M, MS-DOS, OS/2, Microsoft Windows
%0D: Commodore machines, Apple II family and Mac OS up to version 9

Thanks pr and Bart. It seems the two options (''%0D'' and ''%0A'') need to
be corrected. How about this?

var urlencode = (function() {

var f = function(s) {
return encodeURIComponent(s).replace(/%20/,
''+'').replace(/(.{0,3})(%0A)/g,
function(m, p1, p2) {return p1+(p1==''%0D''?'''':''%0D'')+p2;}
).replace(/(%0D)(.{0,3})/g,
function(m, p1, p2) {return p1+(p2==''%0A''?'''':''%0A'')+p2;});
};

try {
if (f(''\n \r'') == ''%0D%0A+%0D%0A'') {
return f;
}
}
catch(e) {}

})();
Using try-catch is a nice way to avoid host object feature testing and
ensure that all the necessary parts of the regexp are working as
expected. This makes a full test of the new feature in a very small
space.

However, try-catch doesn''t appeal to some programmers. Any other
option to test that replace can take a function for the second
argument?

Peter


这篇关于url编码字符串(代码值推荐项目)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆