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.