導航:首頁 > 編程語言 > urlencoderpython

urlencoderpython

發布時間:2023-01-15 17:05:14

『壹』 get和post的區別並講解到urlencode和亂碼問題

form有2中方法把數據提交給伺服器,get和post,分別說下吧。
(一)get提交
1.首先說下客戶端(瀏覽器)的form表單用get方法是如何將數據編碼後提交給伺服器端的吧。

對於get方法來說,都是把數據串聯在請求的url後面作為參數,如:http://localhost:8080/servlet?msg=abc
(很常見的一個亂碼問題就要出現了,如果url中出現中文或其它特殊字元的話,如:http://localhost:8080//servlet?msg=杭州,伺服器端容易得到亂碼),url拼接完成後,瀏覽器會對url進行URL encode,然後發送給伺服器,URL encode的過程就是把部分url做為字元,按照某種編碼方式(如:utf-8,gbk等)編碼成二進制的位元組碼,然後每個位元組用一個包含3個字元的字 符串 "%xy" 表示,其中xy為該位元組的兩位十六進製表示形式。我這里說的可能不清楚,具體介紹可以看下java.net.URLEncoder類的介紹在這里。了解了 URL encode的過程,我們能看到2個很重要的問題,第一:需要URL encode的字元一般都是非ASCII的字元(籠統的講),再通俗的講就是除了英文字母以外的文字(如:中文,日文等)都要進行URL encode,所以對於我們來說,都是英文字母的url不會出現伺服器得到亂碼問題,出現亂碼都是url裡面帶了中文或特殊字元造成的;第二:URL encode到底按照那種編碼方式對字元編碼?這里就是瀏覽器的事情了,而且不同的瀏覽器有不同的做法,中文版的瀏覽器一般會默認的使用GBK,通過設置 瀏覽器也可以使用UTF-8,可能不同的用戶就有不同的瀏覽器設置,也就造成不同的編碼方式,所以很多網站的做法都是先把url裡面的中文或特殊字元用 javascript做URL encode,然後再拼接url提交數據,也就是替瀏覽器做了URL encode,好處就是網站可以統一get方法提交數據的編碼方式。 完成了URL encode,那麼現在的url就成了ASCII范圍內的字元了,然後以iso-8859-1的編碼方式轉換成二進制隨著請求頭一起發送出去。這里想多說 幾句的是,對於get方法來說,沒有請求實體,含有數據的url都在請求頭裡面,之所以用URL encode,我個人覺的原因是:對於請求頭來說最終都是要用iso-8859-1編碼方式編碼成二進制的101010.....的純數據在互聯網上傳 送,如果直接將含有中文等特殊字元做iso-8859-1編碼會丟失信息,所以先做URL encode是有必要的。
2。伺服器端(tomcat)是如何將數據獲取到進行解碼的。
第一步是先把數據用iso-8859-1進行解碼,對於get方法來說,tomcat獲取數據的是ASCII范圍內的請求頭字元,其中的請求url裡面帶 有參數數據,如果參數中有中文等特殊字元,那麼目前還是URL encode後的%XY狀態,先停下,我們先說下開發人員一般獲取數據的過程。通常大家都是request.getParameter("name")獲 取參數數據,我們在request對象或得的數據都是經過解碼過的,而解碼過程中程序里是無法指定,這里要說下,有很多新手說用 request.setCharacterEncoding("字元集")可以指定解碼方式,其實是不可以的,看servlet的官方API說明有對此方 法的解釋:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出對於get方法他是無能為力的。那麼到底用什麼編碼方式解碼數據的呢,這是tomcat的事情了,默認預設用的是 iso-8859-1,這樣我們就能找到為什麼get請求帶中文參數為什麼在伺服器端得到亂碼了,原因是在客戶端一般都是用UTF-8或GBK對數據 URL encode,這里用iso-8859-1方式URL decoder顯然不行,在程序里我們可以直接
Java代碼
1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客戶端指定的URL encode編碼方式")
還原回位元組碼,然後用正確的方式解碼數據,網上的文章通常是在tomcat裡面做個配置
Xml代碼
1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>
這樣是讓tomcat在獲取數據後用指定的方式URL decoder,URL decoder的介紹在這里
(二)post提交
1.客戶端(瀏覽器)的form表單用post方法是如何將數據編碼後提交給伺服器端的。
在post方法里所要傳送的數據也要URL encode,那麼他是用什麼編碼方式的呢?
在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字元集(GBK,utf-8等)"/>,那麼post就會用此處指定的編碼方式編碼。一般大家都認為這段代碼是為了讓瀏覽器知道用 什麼字元集來對網頁解釋,所以網站都會把它放在html代碼的最前端,盡量不出現亂碼,其實它還有個作用就是指定form表單的post方法提交數據的 URL encode編碼方式。從這里可以看出對於get方法來數,瀏覽器對數據的URL encode的編碼方式是有瀏覽器設置來決定,(可以用js做統一指定),而post方法,開發人員可以指定。
2。伺服器端(tomcat)是如何將數據獲取到進行解碼的。
如果用tomcat默認預設設置,也沒做過濾器等編碼設置,那麼他也是用iso-8859-1解碼的,但是request.setCharacterEncoding("字元集")可以派上用場。
我發現上面說的tomcat所做的事情前提都是在請求頭里沒有指定編碼方式,如果請求頭里指定了編碼方式將按照這種方式編碼。

『貳』 url編碼問題在python中怎麼解決

最近在抓取一些js代碼產生的動態數據,需要模擬js請求獲得所需用的數據,遇到對url進行編碼和解碼的問題,就把遇到的問題總結一下,有總結才有進步,才能使學到的知識更加清晰。對url進行編碼和解碼,python提供了很方便的介面進行調用。

url中的query帶有特殊字元(不是url的保留字)時需要進行編碼。當url中帶有漢字時,需要特殊的處理才能正確編碼,以下都只針對這種情形,當然也適用於純英文字元的url。

(1) url編碼:

import urllib

url = 'wd=哈哈' #如果此網站編碼是gbk的話,需要進行解碼,從gbk解碼成unicode,再從Unicode編碼編碼為utf-8格式。

url = url.decode('gbk', 'replace')

print urllib.quote(url.encode('utf-8', 'replace'))

結果: 3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88

(2) url解碼:

import urllib

encoded_url = est.com%2fs%3fwd%3d%e5%93%88%e5%93%88'

print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace') #反過來

函數調用的參數以及結果都是utf-8編碼的,所以在對url編碼時,需要將參數串的編碼從原始編碼轉換成utf-8,

對url解碼時,需要將解碼結果從utf-8轉換成原始編碼格式。

依據網站採用的編碼不同,或是gbk或是utf-8,賦賦予不同的編碼,進行不同的url轉碼。GBK格式,一個中文字元轉為%xx%xx,共兩組;utf-8格式,一個中文字元轉為%xx%xx%xx,共三組。

『叄』 jfinal 如何導出zip壓縮文件

官網介紹:JFinal 是基於 Java 語言的極速 WEB + ORM 框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java語言所有優勢的同時再擁有ruby、python、php等動態語言的開發效率!為您節約更多時間,去陪戀人、家人和朋友 :)

Jfinal做為後台,進行下載文件服務時,源碼中可看到:

Controller中已經提供了,方法:

/**
*Renderwithfile
*/
publicvoidrenderFile(StringfileName){
render=renderManager.getRenderFactory().getFileRender(fileName);
}

/**
*Renderwithfile,
*/
publicvoidrenderFile(StringfileName,StringdownloadFileName){
render=renderManager.getRenderFactory().getFileRender(fileName,downloadFileName);
}

/**
*Renderwithfile
*/
publicvoidrenderFile(Filefile){
render=renderManager.getRenderFactory().getFileRender(file);
}

/**
*Renderwithfile,
file=文件,downloadFileName=下載時客戶端顯示的文件名稱,很貼心
*/
publicvoidrenderFile(Filefile,StringdownloadFileName){
render=renderManager.getRenderFactory().getFileRender(file,downloadFileName);
}

大家可以看到源碼中 FileRender 是有處理各個瀏覽器的兼容問題,所以可以方便的使用

/**
*Copyright(c)2011-2017,JamesZhan詹波([email protected]).
*
*LicensendertheApacheLicense,Version2.0(the"License");
*.
*YoumayobtainaoftheLicenseat
*
*http://www.apache.org/licenses/LICENSE-2.0
*
*,software
*"ASIS"BASIS,
*,eitherexpressorimplied.
*
*limitationsundertheLicense.
*/

packagecom.jfinal.render;

importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.UnsupportedEncodingException;
importjava.net.URLEncoder;
importjavax.servlet.ServletContext;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcom.jfinal.kit.LogKit;
importcom.jfinal.kit.StrKit;

/**
*FileRender.
*/
{

_CONTENT_TYPE="application/octet-stream";
;
;

protectedFilefile;
=null;

publicFileRender(Filefile){
if(file==null){
("filecannotbenull.");
}
this.file=file;
}

publicFileRender(Filefile,StringdownloadFileName){
this(file);

if(StrKit.isBlank(downloadFileName)){
("downloadFileNamecannotbeblank.");
}
this.downloadFileName=downloadFileName;
}

publicFileRender(StringfileName){
if(StrKit.isBlank(fileName)){
("fileNamecannotbeblank.");
}

StringfullFileName;
fileName=fileName.trim();
if(fileName.startsWith("/")||fileName.startsWith("\")){
if(baseDownloadPath.equals("/")){
fullFileName=fileName;
}else{
fullFileName=baseDownloadPath+fileName;
}
}else{
fullFileName=baseDownloadPath+File.separator+fileName;
}

this.file=newFile(fullFileName);
}

publicFileRender(StringfileName,StringdownloadFileName){
this(fileName);

if(StrKit.isBlank(downloadFileName)){
("downloadFileNamecannotbeblank.");
}
this.downloadFileName=downloadFileName;
}

staticvoidinit(StringbaseDownloadPath,ServletContextservletContext){
FileRender.baseDownloadPath=baseDownloadPath;
FileRender.servletContext=servletContext;
}

publicvoidrender(){
if(file==null||!file.isFile()){
RenderManager.me().getRenderFactory().getErrorRender(404).setContext(request,response).render();
return;
}

//---------
response.setHeader("Accept-Ranges","bytes");
Stringfn=downloadFileName==null?file.getName():downloadFileName;
response.setHeader("Content-disposition","attachment;"+encodeFileName(request,fn));
StringcontentType=servletContext.getMimeType(file.getName());
response.setContentType(contentType!=null?contentType:DEFAULT_CONTENT_TYPE);

//---------
if(StrKit.isBlank(request.getHeader("Range"))){
normalRender();
}else{
rangeRender();
}
}

protectedStringencodeFileName(StringfileName){
try{
//returnnewString(fileName.getBytes("GBK"),"ISO8859-1");
returnnewString(fileName.getBytes(getEncoding()),"ISO8859-1");
}catch(UnsupportedEncodingExceptione){
returnfileName;
}
}

/**
*依據瀏覽器判斷編碼規則
*/
publicStringencodeFileName(HttpServletRequestrequest,StringfileName){
StringuserAgent=request.getHeader("User-Agent");
try{
StringencodedFileName=URLEncoder.encode(fileName,"UTF8");
//如果沒有UA,則默認使用IE的方式進行編碼
if(userAgent==null){
return"filename=""+encodedFileName+""";
}

userAgent=userAgent.toLowerCase();
//IE瀏覽器,只能採用URLEncoder編碼
if(userAgent.indexOf("msie")!=-1){
return"filename=""+encodedFileName+""";
}

//Opera瀏覽器只能採用filename*
if(userAgent.indexOf("opera")!=-1){
return"filename*=UTF-8''"+encodedFileName;
}

//Safari瀏覽器,只能採用ISO編碼的中文輸出,Chrome瀏覽器,只能採用MimeUtility編碼或ISO編碼的中文輸出
if(userAgent.indexOf("safari")!=-1||userAgent.indexOf("applewebkit")!=-1||userAgent.indexOf("chrome")!=-1){
return"filename=""+newString(fileName.getBytes("UTF-8"),"ISO8859-1")+""";
}

//FireFox瀏覽器,可以使用MimeUtility或filename*或ISO編碼的中文輸出
if(userAgent.indexOf("mozilla")!=-1){
return"filename*=UTF-8''"+encodedFileName;
}

return"filename=""+encodedFileName+""";
}catch(UnsupportedEncodingExceptione){
thrownewRuntimeException(e);
}
}

protectedvoidnormalRender(){
response.setHeader("Content-Length",String.valueOf(file.length()));
InputStreaminputStream=null;
OutputStreamoutputStream=null;
try{
inputStream=newBufferedInputStream(newFileInputStream(file));
outputStream=response.getOutputStream();
byte[]buffer=newbyte[1024];
for(intlen=-1;(len=inputStream.read(buffer))!=-1;){
outputStream.write(buffer,0,len);
}
outputStream.flush();
outputStream.close();
}catch(IOExceptione){
Stringn=e.getClass().getSimpleName();
if(n.equals("ClientAbortException")||n.equals("EofException")){
}else{
thrownewRenderException(e);
}
}catch(Exceptione){
thrownewRenderException(e);
}finally{
if(inputStream!=null)
try{inputStream.close();}catch(IOExceptione){LogKit.error(e.getMessage(),e);}
}
}

protectedvoidrangeRender(){
Long[]range={null,null};
processRange(range);

StringcontentLength=String.valueOf(range[1].longValue()-range[0].longValue()+1);
response.setHeader("Content-Length",contentLength);
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//status=206

//Content-Range:bytes0-499/10000
StringBuildercontentRange=newStringBuilder("bytes").append(String.valueOf(range[0])).append("-").append(String.valueOf(range[1])).append("/").append(String.valueOf(file.length()));
response.setHeader("Content-Range",contentRange.toString());

InputStreaminputStream=null;
OutputStreamoutputStream=null;
try{
longstart=range[0];
longend=range[1];
inputStream=newBufferedInputStream(newFileInputStream(file));
if(inputStream.skip(start)!=start)
thrownewRuntimeException("Fileskiperror");
outputStream=response.getOutputStream();
byte[]buffer=newbyte[1024];
longposition=start;
for(intlen;position<=end&&(len=inputStream.read(buffer))!=-1;){
if(position+len<=end){
outputStream.write(buffer,0,len);
position+=len;
}
else{
for(inti=0;i<len&&position<=end;i++){
outputStream.write(buffer[i]);
position++;
}
}
}
outputStream.flush();
outputStream.close();
}
catch(IOExceptione){
Stringn=e.getClass().getSimpleName();
if(n.equals("ClientAbortException")||n.equals("EofException")){
}else{
thrownewRenderException(e);
}
}
catch(Exceptione){
thrownewRenderException(e);
}
finally{
if(inputStream!=null)
try{inputStream.close();}catch(IOExceptione){LogKit.error(e.getMessage(),e);}
}
}

/**
*Examplesofbyte-ranges-specifiervalues(assuminganentity-bodyoflength10000):
*Thefirst500bytes(byteoffsets0-499,inclusive):bytes=0-499
*Thesecond500bytes(byteoffsets500-999,inclusive):bytes=500-999
*Thefinal500bytes(byteoffsets9500-9999,inclusive):bytes=-500
*Orbytes=9500-
*/
protectedvoidprocessRange(Long[]range){
StringrangeStr=request.getHeader("Range");
intindex=rangeStr.indexOf(',');
if(index!=-1)
rangeStr=rangeStr.substring(0,index);
rangeStr=rangeStr.replace("bytes=","");

String[]arr=rangeStr.split("-",2);
if(arr.length<2)
thrownewRuntimeException("Rangeerror");

longfileLength=file.length();
for(inti=0;i<range.length;i++){
if(StrKit.notBlank(arr[i])){
range[i]=Long.parseLong(arr[i].trim());
if(range[i]>=fileLength)
range[i]=fileLength-1;
}
}

//Rangeformatlike:9500-
if(range[0]!=null&&range[1]==null){
range[1]=fileLength-1;
}
//Rangeformatlike:-500
elseif(range[0]==null&&range[1]!=null){
range[0]=fileLength-range[1];
range[1]=fileLength-1;
}

//checkfinalrange
if(range[0]==null||range[1]==null||range[0].longValue()>range[1].longValue())
thrownewRuntimeException("Rangeerror");
}
}

『肆』 python怎麼將url的中文怎麼轉碼

先引入urllib模塊
假如我們要對下面的url進行轉碼,注意觀察各種字元的變化
使用quote方法,進行轉碼
我們看看轉碼得到的結果:
我們想要得到原先的url,可以使用quote的逆函數unquote
得到反轉碼以後的url,我們看到這種方法並沒有返回中文字元。

『伍』 判斷字元串是否url encoder

有的時候,我們並不知道介面傳過來的字元串數據是否是經過了URLENCODER處理後的數據;或者介面上線後,突然有部分調用者對參數URLENCODER處理,而有部分調用者沒有;那麼這種情況下,我們只有在介面層面,來適配參數了;下面一個類用來對參數進行url coder處理;可以直接用。其中hasEnCode方法就是用來判斷函數是否進行了url encoder處理;

『陸』 什麼是URL編碼和URL解碼

因為在程序中無法直接請求一個含有中文的url,所以,我們要對它編碼,我們一般會編成gbk,utf-8,但是URL編碼和gbk,utf-8編碼的區別是,它不會把所有字元都編碼,
它只對非字母數字的字元藉助utf-8或gbk來編碼。
編碼時注意 不能把整個url路徑傳到UrlEncoder的decode方法中,因為它也會把反斜杠/和冒號:也編碼,所以域名部分是不需要編碼的,取出路徑部分 /圖片/華仔.jpg

『柒』 Python3 如何對url解碼實現Python2中urllib.unquote的作用

url編碼:

import urllib

url = 'http://test.com/s?wd=哈哈' #如果此網站編碼是gbk的話,需要進行解碼,從gbk解碼成unicode,再從Unicode編碼編碼為utf-8格式。

url = url.decode('gbk', 'replace')

print urllib.quote(url.encode('utf-8', 'replace'))

『捌』 python解析xml文件

可以使用beautifulsoup解析,或者自己使用正則表達式:(import re)

tr_tags = re.findall(r"<tr>(?P[wW]*?)</tr>", jsp_html_content)

for tag in tr_tags:

first_str = re.findall(r"title="(?P[wW]*?)"", tag)[0]

second_str = re.findall(r"encode("(?P[wW]*?)"", tag)[0]

third_str = re.findall(r"%>">(?P[wW]*?)</a>", tag)[0]

此時first_str, second_str, third_str 就對應於【文件中所有的 "文件11", "/file/1文件11.pdf", "文件11" 這三個信息"】

『玖』 python3.4中urllib 有沒有urlencode函數

『拾』 python url 編碼解碼

中文的gbk(GB2312)編碼: 一個漢字對應兩組%xx,即%xx%xx
中文的UTF-8編碼: 一個漢字對應三組%xx,即%xx%xx%xx

閱讀全文

與urlencoderpython相關的資料

熱點內容
python中多個隨機數的生成 瀏覽:118
伺服器偵聽埠是什麼意思 瀏覽:320
手機通知音效文件夾 瀏覽:134
pdf產品目錄 瀏覽:202
三菱fd編譯通過不了 瀏覽:156
15g游戲下載完怎麼解壓 瀏覽:708
編譯原理文法中的句型 瀏覽:755
出售廣聯達雲翻樣加密狗 瀏覽:276
把多頁pdf合並軟體 瀏覽:325
熱點已保存加密可上網什麼原因 瀏覽:557
張家口app怎麼查看全部賬號 瀏覽:183
cad先選擇命令 瀏覽:749
我的世界命令方塊手機版 瀏覽:254
迅投python下單 瀏覽:471
javamd5加密32位 瀏覽:469
php連接mysql測試代碼 瀏覽:473
如何下載亞馬遜app安卓 瀏覽:698
解壓神器大組合 瀏覽:728
多次編譯一個內核會快嗎 瀏覽:162
單片機伺服500k 瀏覽:868