java.net.URLEncoder.encode (สตริง) เลิกใช้แล้วฉันควรใช้อะไรแทน


192

ฉันได้รับคำเตือนต่อไปนี้เมื่อใช้java.net.URLEncoder.encode:

คำเตือน: [deprecation] encode (java.lang.String)
         ใน java.net.URLEncoder เลิกใช้แล้ว

ฉันควรใช้อะไรแทน


23
คำตอบนี้อยู่ในแท็กการคัดค้านในเอกสาร: "แทนที่จะใช้เมธอดเข้ารหัส (สตริง, สตริง) แทนการเข้ารหัส" ดูjava.sun.com/javase/6/docs/api/java/net/URLEncoder.html
— Michael Myers

คำตอบ:


278

ใช้encodeวิธีอื่นในURLEncoder :

URLEncoder.encode(String, String)

พารามิเตอร์แรกคือข้อความที่จะเข้ารหัส; ที่สองคือชื่อของการเข้ารหัสอักขระที่จะใช้ (เช่น, UTF-8) ตัวอย่างเช่น:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);

14
@jsh: ฉันสับสนทำไมไม่ควรมี URLDecoder ทำไมจึงทำให้ Java bloated? เหล่านี้เป็นวิธีการคงที่ มันต้องใช้ความพยายามเท่ากันในการพิมพ์ ถ้าคุณชอบ Python ทำไมคุณถึงเขียนโปรแกรมใน Java? เป็นเพราะคนใช้ Java มากกว่า Python และคุณได้งาน Java แทนที่จะเป็นงาน Python
— stepanian

10
เขาเรียกมันว่าป่องเพราะมันล้นเนมสเปซระดับโลก ทำไมต้องมี URLEncoder.encode และ URLDecoder.decode เมื่อคุณมี URL.encode และ URL.decode หรือแม้แต่ URLEncoder.decode ทำไมต้องทำซ้ำซ้อนและบวมทั้งหมด? เพราะจาวา
— BT

30
และจากนั้นคุณต้องจัดการ UnsupportedEncodingException แม้ว่า UTF-8 ควรได้รับการสนับสนุนจากทุกหนทุกแห่ง
— Dave Cameron

8
@tc .: Java 7 แนะนำค่าคงที่เหล่านี้: StandardCharsets.US_ASCIIและStandardCharsets.UTF_8อื่น ๆ แต่น่าเสียดายที่URLEncoder.encodeไม่ยอมรับCharset... (แต่มีวิธีอื่น ๆ อีกมากมาย)
— sleske

12
คำแนะนำเล็ก ๆ น้อย ๆ - URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name())การใช้งาน โดยใช้ค่าคงที่คงที่UTF_8ของtoString()วิธีการเป็นรูปแบบการเข้ารหัสอักขระพ่นjava.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]เป็นtoString()ผลตอบแทน 'java.nio.charset.CharsetICU [UTF-8]' ในการรับ "UTF-8" ที่ต้องการให้ใช้name()วิธีการแทน
— et_l


24

ใช้คลาสURLEncoder :

URLEncoder.encode(String s, String enc)

ที่ไหน:

s - สตริงที่จะแปล

ENC - ชื่อของสนับสนุนการเข้ารหัสอักขระ

ชุดอักขระมาตรฐาน:

US-ASCII ASCII เจ็ดบิตหรือ ISO646-US หรือบล็อกละตินพื้นฐานของชุดอักขระ Unicode ISO-8859-1 ISO อักษรละตินหมายเลข 1 หรือ ISO-LATIN-1

UTF-8รูปแบบการแปลง UCS แปดบิต

UTF-16BE รูปแบบการแปลง UCS สิบหกบิต, คำสั่งไบต์ขนาดใหญ่

UTF-16LE รูปแบบการแปลง UCS สิบหกบิต, ลำดับไบต์แบบ end-endian

UTF-16รูปแบบการแปลง UCS แบบสิบหกบิตลำดับไบต์ที่ระบุโดยเครื่องหมายทางเลือกแบบไบต์

ตัวอย่าง:

import java.net.URLEncoder;

String stringEncoded = URLEncoder.encode(
    "This text must be encoded! aeiou áéíóú ñ, peace!", "UTF-8");

1

พารามิเตอร์แรกคือสตริงที่จะเข้ารหัส; ที่สองคือชื่อของการเข้ารหัสอักขระที่จะใช้ (เช่น UTF-8)


0

เป็นการอ้างอิงเพิ่มเติมสำหรับคำตอบอื่น ๆ แทนที่จะใช้"UTF-8"คุณสามารถใช้:

HTTP.UTF_8

ซึ่งถูกรวมตั้งแต่ Java 4 เป็นส่วนหนึ่งของไลบรารี org.apache.http.protocol ซึ่งรวมอยู่ด้วยตั้งแต่ Android API 1


ผิดคลานี้ถูกพบใน Apache HttpClient 4.x ห้องสมุดorg.apache.http.protocol.HTTPชั้น
— Buhake Sindi

@BuhakeSindi จริงฉันอ่าน API 1 แต่มันเป็นของ Android ไม่ใช่ Java ไม่ว่ามันจะมีอยู่ก่อนหน้า Java 7 มันจะเลิกใช้แล้วแม้แต่ฮ่า ๆ
— htafoya

ไม่คลาสนี้ไม่มีอยู่ใน Java JDK เวอร์ชันใด ๆ Android ติดตามห้องสมุด Apache HttpClient (ฉันจะไม่แปลกใจถ้าพวกเขาเอาซอร์สโค้ดจากที่นั่นด้วย)
— Buhake Sindi

3
คำเตือน: [เลิก] UTF_8 ใน HTTP ได้เลิก
— sgtdck

0

การใช้งานของorg.apache.commons.httpclient.URIไม่ได้เป็นปัญหาอย่างเคร่งครัด; สิ่งที่เป็นปัญหาคือการที่คุณกำหนดเป้าหมายตัวสร้างที่ไม่ถูกต้องซึ่งจะคิดค่าเสื่อมราคา

ใช้เพียง

new URI( [string] );

จะตั้งค่าสถานะเป็นค่าเสื่อมราคาแน่นอน สิ่งที่จำเป็นคือการจัดเตรียมอาร์กิวเมนต์เพิ่มเติมอย่างน้อยหนึ่งอาร์กิวเมนต์ (ตัวแรก, ด้านล่าง), และข้อสอง:

  1. escaped: จริงถ้าลำดับอักขระ URI อยู่ในรูปแบบ Escape เท็จอย่างอื่น
  2. charset: สตริงชุดอักขระที่จะหลีกเลี่ยงการเข้ารหัสหากจำเป็น

สิ่งนี้จะกำหนดเป้าหมายไปยังตัวสร้างที่ไม่คิดค่าเสื่อมราคาภายในคลาสนั้น ดังนั้นการใช้งานในอุดมคติจะเป็นเช่นนี้:

new URI( [string], true, StandardCharsets.UTF_8.toString() );

บิตบ้าในช่วงปลายเกม (ผมกว่า 11 ปีต่อมา - ! Egad ) แต่ฉันหวังว่านี้จะช่วยให้คนอื่น ๆ โดยเฉพาะอย่างยิ่งหากวิธีที่ปลายสุดจะยังคงคาดหวังว่า URI org.apache.commons.httpclient.setURI()เช่น

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