เมื่อใดที่คุณควรใช้ Escape แทน encodeURI / encodeURIComponent


1392

เมื่อเข้ารหัสสตริงการสืบค้นที่จะส่งไปยังเว็บเซิร์ฟเวอร์ - เมื่อใดที่คุณใช้escape()และเมื่อใดที่คุณจะใช้encodeURI()หรือencodeURIComponent():

ใช้หลบหนี:

escape("% +&=");

หรือ

ใช้ encodeURI () / encodeURIComponent ()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");

111
มันคุ้มค่าที่ชี้ให้เห็นว่าencodeURIComponent("var1=value1&var2=value2")เป็นไม่ได้กรณีการใช้งานทั่วไป ตัวอย่างนั้นจะเข้ารหัส=และ&ซึ่งอาจไม่ใช่สิ่งที่ตั้งใจไว้! encodeURIComponentโดยทั่วไปจะใช้แยกต่างหากกับค่าในแต่ละคู่ของค่าคีย์ (ส่วนหลังแต่ละค่า=)
Timothy Shields

3
คุณต้องทำอะไรกับกุญแจหรือไม่ เกิดอะไรขึ้นถ้ามันมี = ในมัน? (เป็นไปได้ว่ายัง?)
Mala

3
@Mala ฉันยังใหม่กับการเขียนโปรแกรมเว็บโดยทั่วไป แต่สิ่งที่ฉันใช้ในประสบการณ์ที่ จำกัด ของฉันคือการเข้ารหัสคีย์และค่าแยกต่างหากเพื่อให้มั่นใจว่า '=' อยู่: var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);- บางทีคนอื่นอาจจะรู้วิธีที่ดีกว่า
nedshares

1
@shareshares ฉันเล่นกับมัน แต่เท่าที่ฉันสามารถบอกได้ว่าคีย์นั้นดูเหมือนจะไม่ถูกเข้ารหัส ... อย่างน้อยก็ไม่ใช่ในแบบเดียวกัน อาจจะผิดกับ spec ที่จะมี = ในคีย์?
Mala

1
นอกจากนี้ยังมีค่าใช้จ่ายที่ชี้ให้เห็นว่าการใช้งาน JavaScript ล่าสุดให้URLอินเตอร์เฟสและURLSearchParamsระดับสูงกว่าสำหรับการจัดการ URL และสตริงการสืบค้น
บาร์ตโรบินสัน

คำตอบ:


1914

หนี()

อย่าใช้มัน! escape()มีการกำหนดไว้ในส่วนB.2.1.2 การหลบหนีและข้อความแนะนำของภาคผนวก Bพูดว่า:

... คุณสมบัติและพฤติกรรมภาษาทั้งหมดที่ระบุในภาคผนวกนี้มีลักษณะที่ไม่พึงประสงค์ตั้งแต่หนึ่งข้อขึ้นไปและหากไม่มีการใช้งานแบบดั้งเดิมจะถูกลบออกจากข้อกำหนดนี้ ...
... โปรแกรมเมอร์ไม่ควรใช้หรือสันนิษฐานว่ามีคุณสมบัติและพฤติกรรมเหล่านี้เมื่อเขียนรหัส ECMAScript ใหม่ ....

พฤติกรรม:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

อักขระพิเศษมีการเข้ารหัสยกเว้น: @ * _ + -. /

รูปแบบเลขฐานสิบหกสำหรับตัวอักษรที่มีโค้ดหน่วยค่า 0xFF %xxหรือน้อยกว่าเป็นสองหลักลำดับหนี:

สำหรับตัวละครที่มีหน่วยรหัสมากขึ้น%uxxxxจะใช้รูปแบบตัวเลขสี่หลัก สิ่งนี้ไม่ได้รับอนุญาตภายในสตริงการสืบค้น (ตามที่กำหนดในRFC3986 ):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

อนุญาตให้ใช้เครื่องหมายเปอร์เซนต์ได้ก็ต่อเมื่อมันถูกตามด้วย hexdigits สองตัวเท่านั้นuไม่อนุญาตให้ใช้เปอร์เซ็นต์

encodeURI ()

ใช้ encodeURI เมื่อคุณต้องการ URL ที่ใช้งานได้ โทรออกนี้:

encodeURI("http://www.example.org/a file with spaces.html")

ที่จะได้รับ:

http://www.example.org/a%20file%20with%20spaces.html

อย่าเรียกใช้ encodeURIConent เพราะจะทำลาย URL และส่งคืน

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

ใช้ encodeURIComponent เมื่อคุณต้องการเข้ารหัสค่าพารามิเตอร์ URL

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

จากนั้นคุณสามารถสร้าง URL ที่คุณต้องการ:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

และคุณจะได้รับ URL ที่สมบูรณ์นี้:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

โปรดทราบว่า encodeURIComponent ไม่ได้หลบหนี'ตัวละคร ข้อผิดพลาดทั่วไปคือการใช้มันเพื่อสร้างคุณสมบัติ html เช่นhref='MyUrl'ซึ่งอาจประสบข้อผิดพลาดในการฉีด หากคุณกำลังสร้าง html จากสตริงให้ใช้"แทน'คำพูดของแอตทริบิวต์หรือเพิ่มเลเยอร์พิเศษของการเข้ารหัส ( 'สามารถเข้ารหัสเป็น% 27)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสประเภทนี้คุณสามารถตรวจสอบได้ที่: http://en.wikipedia.org/wiki/Percent-encoding


31
@Francois ขึ้นอยู่กับเซิร์ฟเวอร์ที่รับมันอาจไม่สามารถถอดรหัสได้อย่างถูกต้องว่า Escape เข้ารหัสอักขระ ASCII หรืออักขระที่ไม่ใช่ ASCII เช่น: •ตัวอย่างเช่นคลาส FieldStorage ของ Python จะไม่ถอดรหัสสตริงด้านบนอย่างถูกต้องหากลาออกที่เข้ารหัสแล้ว
เรย์

22
@Francois escape () เข้ารหัสอักขระ ASCII 128 ตัวที่ต่ำกว่ายกเว้นตัวอักษรตัวเลขและ *@-_+./ ในขณะที่ unescape () เป็นค่าผกผันของ escape () เท่าที่ฉันสามารถบอกได้พวกมันคือฟังก์ชั่นดั้งเดิมที่ออกแบบมาเพื่อเข้ารหัส URL และยังคงถูกนำมาใช้เพื่อความเข้ากันได้ย้อนหลังเท่านั้น โดยทั่วไปแล้วพวกเขาไม่ควรใช้เว้นแต่จะมีการโต้ตอบกับแอพ / บริการทางเว็บ / อื่น ๆ ที่ออกแบบมาสำหรับพวกเขา
Anthony DiSanti

3
ยกเว้นกรณีที่คุณกำลังพยายามส่ง URL เป็นส่วนประกอบ URI ซึ่งการเรียกกรณี encodeURIComponent
ทอม

4
ทำไมมันไม่จัดการกับคำพูดเดียว?
Eric

11
@Eric มันไม่ได้เข้ารหัสอ้างคำเดียวเพราะอ้างเดี่ยวเป็นตัวละครที่ถูกต้องสมบูรณ์ที่จะเกิดขึ้นภายใน URI ( RFC-3986 ) ปัญหาเกิดขึ้นเมื่อคุณฝัง URI ภายใน HTML โดยที่เครื่องหมายคำพูดเดี่ยวไม่ใช่อักขระที่ถูกต้อง หลังจากนั้น URIs นั้นควรเป็น "เข้ารหัส HTML" (ซึ่งจะแทนที่'ด้วย') ก่อนที่จะถูกวางลงในเอกสาร HTML
ลี

441

ความแตกต่างระหว่างencodeURI()และencodeURIComponent()คือ 11 ตัวอักษรที่ถูกเข้ารหัสโดย encodeURIComponent แต่ไม่ใช่โดย encodeURI:

ตารางที่มีความแตกต่างสิบประการระหว่าง encodeURI และ encodeURIC

ฉันสร้างตารางนี้ได้อย่างง่ายดายด้วยconsole.tableใน Google Chrome ด้วยรหัสนี้:

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);


เบราว์เซอร์นี้ไม่ได้ขึ้นอยู่กับ?
Pacerier

4
@bladnman encodeURI และ encodeURIComponent ควรใช้วิธีนี้กับเบราว์เซอร์หลักทั้งหมด คุณสามารถทดสอบโค้ดด้านบนใน Chrome และ Firefox ในฐานะที่เป็นทั้งสนับสนุนคอนโซล. ตาราง ในเบราว์เซอร์อื่น ๆ (รวมถึง Firefox และ Chrome) คุณสามารถใช้รหัสต่อไปนี้:var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Johann Echavarria

1
ฉันหมายถึง @Pacerier :)
Johann Echavarria

@Pacerier ควรเหมือนกันในเบราว์เซอร์ต่าง ๆ เว้นแต่ว่าข้อมูลจำเพาะดั้งเดิมนั้นไม่ชัดเจนเกินไป ... โปรดดูstackoverflow.com/questions/4407599//
Christophe Roussy

2
ฉันต้องการที่จะอัปเดตครั้งนี้หลายครั้ง! น่าเสียดายที่สามารถอัปโหลดได้เพียงครั้งเดียวเท่านั้น
Ramazan Polat

46

ฉันพบบทความนี้ enlightening: Javascript Madness: Query String Parsing

ฉันพบว่าเมื่อฉันพยายามขีดเส้นใต้ว่าทำไม decodeURIComponent จึงไม่สามารถถอดรหัส '+' ได้อย่างถูกต้อง นี่คือสารสกัด:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!

11
บทความที่คุณลิงค์มีเรื่องไร้สาระมากมาย มันดูเหมือนว่าฉัน, ผู้เขียนเองก็ไม่เข้าใจสิ่งที่ฟังก์ชั่นที่มีการใช้อย่างถูกต้องสำหรับ ...
คริสโต

2
@ Christoph ทุกอย่างดูสมเหตุสมผลกับฉัน โดยเฉพาะอย่างยิ่งฉันเห็นด้วยกับเขาที่encodeURIดูเหมือนว่าจะมีประโยชน์เฉพาะในกรณีขอบค่อนข้างชัดเจนและไม่จำเป็นต้องมีอยู่จริง ฉันมีความคิดเห็นที่แตกต่างกับเขา แต่ฉันไม่เห็นอะไรเลยที่เป็นเท็จหรืองี่เง่าในนั้น คุณคิดว่าเรื่องไร้สาระเป็นอย่างไรกันแน่?
Mark Amery

1
enctypeแอตทริบิวต์ของFORMระบุองค์ประกอบชนิดเนื้อหาที่ใช้ในการเข้ารหัสข้อมูลชุดรูปแบบสำหรับการส่งไปยังเซิร์ฟเวอร์ application / x-www-form-urlencoded นี่เป็นประเภทเนื้อหาเริ่มต้น แบบฟอร์มที่ส่งมาพร้อมกับประเภทเนื้อหานี้จะต้องเข้ารหัสดังนี้: [... ] อักขระช่องว่างจะถูกแทนที่ด้วย `` + 'และ [... ] อักขระที่ไม่ใช่ตัวอักษรและตัวเลขจะถูกแทนที่ด้วย `% HH', [... ] Ref: HTML4 Sepc
cychoi

2
encodeURIComponent ('A + B') แทนที่ (/ \% 20 / g, '+') + '\ n' + decodeURIComponent ("A +% 2B + B". แทนที่ (/ \ + / g, '% 20' ));
Zlatin Zlatev

39

encodeURIComponent ไม่ได้เข้ารหัส-_.!~*'()ทำให้เกิดปัญหาในการโพสต์ข้อมูลไปยัง php ในสตริง xml

ตัวอย่างเช่น:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

หลบหนีทั่วไปด้วย encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

คุณสามารถเห็นได้ว่าเครื่องหมายคำพูดเดี่ยวไม่ได้เข้ารหัส ในการแก้ไขปัญหาฉันได้สร้างสองฟังก์ชั่นเพื่อแก้ไขปัญหาในโครงการของฉันสำหรับการเข้ารหัส URL:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

สำหรับการถอดรหัส URL:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}

5
นอกจากนี้ยังไม่ทำเครื่องหมาย # (ปอนด์ / แฮช / หมายเลข) ซึ่งก็คือ% 23
xr280xr

1
@ xr280xr คุณหมายถึงอะไร encodeURIComponentทำการเข้ารหัส # เป็น% 23 (อาจจะไม่เป็นในปี 2014?)
David Balažic

38

encodeURI () - ฟังก์ชั่น escape () สำหรับการหลบหนี javascript ไม่ใช่ HTTP


ถ้าฉันมี URL ที่เช่นนี้var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"... และฉันต้องการที่จะเข้าถึงได้ผ่านทาง Google Ajax API เช่นนี้var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;... escape(url)แล้วฉันต้องใช้ encodeURI(url)ไม่ทำงานกับพารามิเตอร์แบบที่ดูเหมือนว่า
Lance Pollard

15
คุณควรใช้ ecnodeURIComponent (url)
Ustaman Sangat

2
ทั้ง 3 ฟังก์ชั่นมีปัญหา มันจะดีกว่าที่จะสร้างฟังก์ชั่นของคุณเองซึ่งทำงาน
Jerry Joseph

17

ตารางเปรียบเทียบขนาดเล็กกับ Java เทียบกับจาวาสคริปต์กับ PHP

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   JAVA JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -JAVA-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84

12

ฉันไม่แนะนำให้ใช้วิธีใดวิธีหนึ่งตามที่เป็นอยู่ เขียนฟังก์ชั่นของคุณเองซึ่งทำสิ่งที่ถูกต้อง

MDN ให้ตัวอย่างที่ดีเกี่ยวกับการเข้ารหัส URL ที่แสดงด้านล่าง

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName);

console.log(header); 
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            //  so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent


1
สิ่งที่เป็นคำตอบที่ดี (ถ้ามันเข้ากันได้ข้ามขอบโครเมี่ยมและ Firefox ในขณะที่ไม่ได้ทำผิดพลาดใด ๆ )
yan bellavance

10

โปรดจำไว้ว่าพวกเขาทั้งหมดเข้ารหัสชุดอักขระที่แตกต่างกันและเลือกชุดอักขระที่คุณต้องการอย่างเหมาะสม encodeURI () เข้ารหัสอักขระน้อยกว่า encodeURIComponent () ซึ่งเข้ารหัสอักขระ (และยังแตกต่างกันไปยังจุดของ dannyp) น้อยกว่า escape ()


8

สำหรับวัตถุประสงค์ในการเข้ารหัสจาวาสคริปต์นั้นมีฟังก์ชั่น inbuilt สามฟังก์ชัน -

  1. escape()- ไม่เข้ารหัส@*/+ วิธีนี้เลิกใช้หลังจาก ECMA 3 ดังนั้นควรหลีกเลี่ยง

  2. encodeURI()- ไม่เข้ารหัส~!@#$&*()=:/,;?+' มันถือว่า URI เป็น URI ที่สมบูรณ์ดังนั้นจึงไม่เข้ารหัสอักขระที่สงวนไว้ซึ่งมีความหมายพิเศษใน URI วิธีนี้จะใช้เมื่อมีเจตนาที่จะแปลง URL ที่สมบูรณ์แทนส่วนพิเศษบางส่วนของ URL ตัวอย่าง - encodeURI('http://stackoverflow.com'); จะให้ - http://stackoverflow.com

  3. encodeURIComponent()- ไม่เข้ารหัส - _ . ! ~ * ' ( ) ฟังก์ชันนี้เข้ารหัสคอมโพเนนต์ Uniform Resource Identifier (URI) โดยแทนที่แต่ละอินสแตนซ์ของอักขระบางตัวด้วยลำดับการหลบหลีกหนึ่ง, สอง, สามหรือสี่ตัวแทนการเข้ารหัส UTF-8 ของอักขระ วิธีนี้ควรใช้ในการแปลงส่วนประกอบของ URL ตัวอย่างเช่นการป้อนข้อมูลของผู้ใช้บางส่วนจะต้องต่อท้ายตัวอย่าง - encodeURIComponent('http://stackoverflow.com'); จะให้ - http% 3A% 2F% 2Fstackoverflow.com

การเข้ารหัสทั้งหมดนี้ดำเนินการใน UTF 8 เช่นตัวละครจะถูกแปลงในรูปแบบ UTF-8

encodeURIC ประกอบด้วยความแตกต่างจาก encodeURI ซึ่งเข้ารหัสอักขระที่สงวนไว้และเครื่องหมายหมายเลข # ของ encodeURI


3

ฉันพบว่าการทดลองด้วยวิธีการต่าง ๆ เป็นการตรวจสุขภาพที่ดีแม้ว่าจะมีการจัดการที่ดีว่าการใช้และความสามารถต่างๆของพวกเขานั้นเป็นอย่างไร

ในตอนท้ายฉันพบเว็บไซต์นี้มีประโยชน์อย่างยิ่งในการยืนยันความสงสัยของฉันว่าฉันกำลังทำสิ่งที่เหมาะสม มันยังพิสูจน์แล้วว่ามีประโยชน์สำหรับการถอดรหัสสตริง encodeURIComponent'ed ซึ่งค่อนข้างท้าทายในการตีความ บุ๊กมาร์กที่ยอดเยี่ยมที่มี:

http://www.the-art-of-web.com/javascript/escape/


2

คำตอบที่ยอมรับได้ดี เพื่อขยายในส่วนสุดท้าย:

โปรดทราบว่า encodeURIComponent จะไม่สามารถใช้อักขระ ' ข้อผิดพลาดทั่วไปคือการใช้มันเพื่อสร้างคุณสมบัติ html เช่น href = 'MyUrl' ซึ่งอาจได้รับข้อผิดพลาดในการฉีด หากคุณกำลังสร้าง html จากสตริงให้ใช้ "แทน" สำหรับเครื่องหมายคำพูดของแอตทริบิวต์หรือเพิ่มเลเยอร์พิเศษของการเข้ารหัส ('สามารถเข้ารหัสเป็น% 27)

หากคุณต้องการให้อยู่ในด้านที่ปลอดภัยการเข้ารหัสเปอร์เซ็นต์อักขระที่ไม่ได้จองควรถูกเข้ารหัสเช่นกัน

คุณสามารถใช้วิธีนี้เพื่อหนีพวกเขา (แหล่งMozilla )

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

// fixedEncodeURIComponent("'") --> "%27"

2

Modern rewrite ของคำตอบของ @ johann-echavarria:

console.log(
    Array(256)
        .fill()
        .map((ignore, i) => String.fromCharCode(i))
        .filter(
            (char) =>
                encodeURI(char) !== encodeURIComponent(char)
                    ? {
                          character: char,
                          encodeURI: encodeURI(char),
                          encodeURIComponent: encodeURIComponent(char)
                      }
                    : false
        )
)

หรือถ้าคุณสามารถใช้ตารางให้แทนที่console.logด้วยconsole.table(สำหรับเอาต์พุตที่สวยกว่า)


2

ได้รับแรงบันดาลใจจากโต๊ะของโยฮันฉันจึงตัดสินใจที่จะต่อเติมโต๊ะ ฉันต้องการดูว่าอักขระ ASCII ใดได้รับการเข้ารหัส

สกรีนช็อตของ console.table

ตารางแสดงเฉพาะอักขระที่เข้ารหัส เซลล์ว่างหมายความว่าตัวละครเดิมและตัวเข้ารหัสเหมือนกัน


เพียงเพื่อจะเสริมฉันเพิ่มตารางอื่นสำหรับVSurlencode() rawurlencode()ความแตกต่างเพียงอย่างเดียวคือการเข้ารหัสของอักขระช่องว่าง

สกรีนช็อตของ console.table

<script>
<?php
$ascii = str_split(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", 1);
$encoded = [];
foreach ($ascii as $char) {
    $obj = ["char" => $char];
    if ($char != urlencode($char))
        $obj["urlencode"] = urlencode($char);
    if ($char != rawurlencode($char))
        $obj["rawurlencode"] = rawurlencode($char);
    if (isset($obj["rawurlencode"]) || isset($obj["rawurlencode"]))
        $encoded[] = $obj;
}
echo "var encoded = " . json_encode($encoded) . ";";
?>
console.table(encoded);
</script>

1

ฉันมีฟังก์ชั่นนี้ ...

var escapeURIparam = function(url) {
    if (encodeURIComponent) url = encodeURIComponent(url);
    else if (encodeURI) url = encodeURI(url);
    else url = escape(url);
    url = url.replace(/\+/g, '%2B'); // Force the replacement of "+"
    return url;
};

4
@ChristianVielma escape () เลิกใช้แล้ว แต่ไม่เคยอ้างอิง w3schools.com ดู w3fools.com
Jerry Joseph

4
@Christian Vielma - บางคนพบว่าวัสดุอ้างอิงที่W3Schoolsจะเป็นน้อยขัดแย้งและมีประโยชน์ ไม่ใช่ทุกคนที่เห็นด้วยว่าไม่ควรอ้างอิง W3Schools
DavidRR

2
W3Schools ได้รับการลงโทษที่ไม่ดี แน่นอนว่ามันไม่ถูกต้องเสมอไป แต่หลังจากนั้นฉันก็เจอบล็อกโพสต์ที่ผิดมากมายเช่นกัน สำหรับฉันบางครั้งมันเป็นจุดเริ่มต้นที่ดีเพียงเพื่อเรียนรู้คำศัพท์บางอย่างแล้วฉันก็ดำดิ่งลงไปอีกเล็กน้อยกับแหล่งข้อมูลอื่น ๆ สิ่งสำคัญที่สุดคือทรัพยากรเดียวไม่ควรเป็นคัมภีร์ไบเบิลเมื่อพูดถึงเรื่องแบบนี้
ryandlf

ดูเหมือน @molokoloco เขียนฟังก์ชันนี้เป็นทางเลือกให้กับเวอร์ชันที่encodeURIไม่มีอยู่ แต่escapeมีอยู่จริง
SOFe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.