दिलचस्प पोस्ट
जहां log4j.xml को जगह दें नेस्टेड क्लास से संलग्न कक्षा में फ़ील्ड तक पहुंचने का सबसे अच्छा तरीका क्या है? यदि स्ट्रिंग तुलना के साथ बयान विफल हो जाता है अजगर में imaplib का उपयोग करके ईमेल निकाय कैसे प्राप्त करें? जावा प्रदर्शन परीक्षण फेसबुक पोस्ट सभी प्रतिक्रियाओं को एक सिंगल ग्राफ एपीआई अनुरोध में गणना करना सशर्त रूप से प्रदर्शित JSF घटकों सीएफएलएफ के साथ एलएफ़ की जगह जीआईटी कैसे सूची बॉक्स चयन पृष्ठभूमि रंग बदलने के लिए? सी # में घुंघराले ब्रेसिज़ फ़्लोटिंग UserControl में कुंजी बाइंडिंग तब काम नहीं करता जब पाठ बॉक्स का फ़ोकस होता है आधुनिक टीसीपी कनेक्शन की सैद्धांतिक अधिकतम संख्या क्या है जो आधुनिक लिनक्स बॉक्स में हो सकती है एक सूची <> में आइटम प्राप्त करने के लिए LINQ का उपयोग करें, जो किसी दूसरी सूची में नहीं हैं <> PHP SimpleXMlelement सरणी से मूल्य प्राप्त करें Xcode 8 में अनन्य रूप से अनदेखी वैकल्पिक आवंटन

जावा के एन्कोडुरिकमोनेंट के बराबर जावा जो समान आउटपुट का उत्पादन करता है?

मैं जावा संहिता के विभिन्न बिट्स के साथ प्रयोग कर रहा हूं जो कुछ ऐसी चीज के साथ आने की कोशिश कर रहा है जिसमें उद्धरण, रिक्त स्थान और "विदेशी" यूनिकोड वर्ण युक्त स्ट्रिंग को एन्कोड करना होगा और उत्पादन का उत्पादन होगा जो जावास्क्रिप्ट के एनकोडुरआईकॉम्पन्ट फ़ंक्शन के समान है।

मेरा यातना परीक्षण स्ट्रिंग है: "ए" बी ± "

अगर मैं निम्नलिखित जावास्क्रिप्ट स्टेटमेंट को फायरबग में डालता हूं:

encodeURIComponent('"A" B ± "'); 

-तो मुझे मिल जाएगा:

 "%22A%22%20B%20%C2%B1%20%22" 

यहां मेरा छोटा परीक्षण जावा प्रोग्राम है:

 import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class EncodingTest { public static void main(String[] args) throws UnsupportedEncodingException { String s = "\"A\" B ± \""; System.out.println("URLEncoder.encode returns " + URLEncoder.encode(s, "UTF-8")); System.out.println("getBytes returns " + new String(s.getBytes("UTF-8"), "ISO-8859-1")); } } 

-इस प्रोग्राम के आउटपुट:

  URLEncoder.encode रिटर्न% 22 ए% 22 + बी +% सी 2% बी 1 + 22%
 GetBytes रिटर्न "ए" बी ± " 

नजदीक पर बिना सिगार के! जावा का इस्तेमाल करते हुए एक यूटीएफ -8 स्ट्रिंग एन्कोडिंग का सबसे अच्छा तरीका क्या है, ताकि जावास्क्रिप्ट के encodeURIComponent रूप में एक ही उत्पादन का उत्पादन किया जा सके?

संपादित करें: मैं जावा 1.4 का उपयोग कर 5 जावा में चल रहा हूं।

Solutions Collecting From Web of "जावा के एन्कोडुरिकमोनेंट के बराबर जावा जो समान आउटपुट का उत्पादन करता है?"

कार्यान्वयन मतभेद को देखते हुए, मैं देखता हूं:

एनकोडयूआरआईसीएमएन्ट पर एमडीसी encodeURIComponent() :

  • शाब्दिक अक्षर (regex प्रतिनिधित्व): [-a-zA-Z0-9._*~'()!]

URLEncoder पर जावा 1.5.0 प्रलेखन :

  • शाब्दिक वर्ण (रेगेक्स प्रतिनिधित्व): [-a-zA-Z0-9._*]
  • स्पेस वर्ण " " प्लस चिह्न में बदल जाता है "+"

तो मूल रूप से, वांछित परिणाम प्राप्त करने के लिए, URLEncoder.encode(s, "UTF-8") और फिर कुछ पोस्ट प्रोसेसिंग करें:

  • "%20" साथ "%20" "+" की सभी घटनाओं की जगह
  • "%xx" की सभी घटनाओं को प्रतिस्थापित करते हुए [~'()!] किसी का प्रतिनिधित्व करते हैं [~'()!] अपने शाब्दिक काउंटर-पार्ट्स पर वापस जाएं

यह वही वर्ग है जिसे मैंने अंत में दिया था:

 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; /** * Utility class for JavaScript compatible UTF-8 encoding and decoding. * * @see http://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-output * @author John Topley */ public class EncodingUtil { /** * Decodes the passed UTF-8 String using an algorithm that's compatible with * JavaScript's <code>decodeURIComponent</code> function. Returns * <code>null</code> if the String is <code>null</code>. * * @param s The UTF-8 encoded String to be decoded * @return the decoded String */ public static String decodeURIComponent(String s) { if (s == null) { return null; } String result = null; try { result = URLDecoder.decode(s, "UTF-8"); } // This exception should never occur. catch (UnsupportedEncodingException e) { result = s; } return result; } /** * Encodes the passed String as UTF-8 using an algorithm that's compatible * with JavaScript's <code>encodeURIComponent</code> function. Returns * <code>null</code> if the String is <code>null</code>. * * @param s The String to be encoded * @return the encoded String */ public static String encodeURIComponent(String s) { String result = null; try { result = URLEncoder.encode(s, "UTF-8") .replaceAll("\\+", "%20") .replaceAll("\\%21", "!") .replaceAll("\\%27", "'") .replaceAll("\\%28", "(") .replaceAll("\\%29", ")") .replaceAll("\\%7E", "~"); } // This exception should never occur. catch (UnsupportedEncodingException e) { result = s; } return result; } /** * Private constructor to prevent this class from being instantiated. */ private EncodingUtil() { super(); } } 

जावास्क्रिप्ट इंजन का उपयोग करना जो जावा 6 के साथ भेज दिया गया है:

import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Wow { public static void main(String[] args) throws Exception { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); engine.eval("print(encodeURIComponent('\"A\" B ± \"'))"); } }
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Wow { public static void main(String[] args) throws Exception { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); engine.eval("print(encodeURIComponent('\"A\" B ± \"'))"); } } 

आउटपुट:% 22 ए% 22% 20 बी% 20% सी 2% बी 1% 20% 22

यह मामला अलग है, लेकिन आप जो चाहते हैं उसके करीब है।

मैं java.net.URI#getRawPath() उपयोग करता java.net.URI#getRawPath() , उदा

 String s = "a+b c.html"; String fixed = new URI(null, null, s, null).getRawPath(); 

fixed का मान a+b%20c.html , जो कि आप क्या चाहते हैं।

URLEncoder.encode() के उत्पादन के बाद प्रसंस्करण यूआरआई में होने वाले किसी भी URLEncoder.encode() को मिटा देगा। उदाहरण के लिए

 URLEncoder.encode("a+b c.html").replaceAll("\\+", "%20"); 

आपको a%20b%20c.html , जिसे ab c.html रूप में समझा जाएगा।

मैं अपने स्वयं के संस्करण के साथ encodeurIComponent, क्योंकि पोस्ट समाधान में एक समस्या है, अगर कोई स्ट्रिंग में उपस्थित था, जिसे एन्कोड किया जाना चाहिए, यह एक स्थान में परिवर्तित हो जाएगा।

तो यहां मेरा वर्ग है:

 import java.io.UnsupportedEncodingException; import java.util.BitSet; public final class EscapeUtils { /** used for the encodeURIComponent function */ private static final BitSet dontNeedEncoding; static { dontNeedEncoding = new BitSet(256); // az for (int i = 97; i <= 122; ++i) { dontNeedEncoding.set(i); } // AZ for (int i = 65; i <= 90; ++i) { dontNeedEncoding.set(i); } // 0-9 for (int i = 48; i <= 57; ++i) { dontNeedEncoding.set(i); } // '()* for (int i = 39; i <= 42; ++i) { dontNeedEncoding.set(i); } dontNeedEncoding.set(33); // ! dontNeedEncoding.set(45); // - dontNeedEncoding.set(46); // . dontNeedEncoding.set(95); // _ dontNeedEncoding.set(126); // ~ } /** * A Utility class should not be instantiated. */ private EscapeUtils() { } /** * Escapes all characters except the following: alphabetic, decimal digits, - _ . ! ~ * ' ( ) * * @param input * A component of a URI * @return the escaped URI component */ public static String encodeURIComponent(String input) { if (input == null) { return input; } StringBuilder filtered = new StringBuilder(input.length()); char c; for (int i = 0; i < input.length(); ++i) { c = input.charAt(i); if (dontNeedEncoding.get(c)) { filtered.append(c); } else { final byte[] b = charToBytesUTF(c); for (int j = 0; j < b.length; ++j) { filtered.append('%'); filtered.append("0123456789ABCDEF".charAt(b[j] >> 4 & 0xF)); filtered.append("0123456789ABCDEF".charAt(b[j] & 0xF)); } } } return filtered.toString(); } private static byte[] charToBytesUTF(char c) { try { return new String(new char[] { c }).getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { return new byte[] { (byte) c }; } } } 

मैं http://blog.sangupta.com/2010/05/encodeuricomponent-and.html पर प्रलेखित अन्य कार्यान्वयन के साथ आया था। कार्यान्वयन भी यूनिकोड बाइट्स को नियंत्रित कर सकता है।

मुझे Google के लिए PercentEscaper वर्ग मिलेगा- http-java-client लाइब्रेरी, जो कि बहुत आसानी से एनकोडुरआईकॉम्पन्ट को लागू करने के लिए इस्तेमाल किया जा सकता है

Google-http-java-client javadoc google-http-java-client घर से PercentEscaper

मैंने java.net.URI क्लास का सफलतापूर्वक उपयोग किया है जैसे:

 public static String uriEncode(String string) { String result = string; if (null != string) { try { String scheme = null; String ssp = string; int es = string.indexOf(':'); if (es > 0) { scheme = string.substring(0, es); ssp = string.substring(es + 1); } result = (new URI(scheme, ssp, null)).toString(); } catch (URISyntaxException usex) { // ignore and use string that has syntax error } } return result; } 

यह एक सरल उदाहरण है रवी वालौ के समाधान:

 public String buildSafeURL(String partialURL, String documentName) throws ScriptException { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager .getEngineByName("JavaScript"); String urlSafeDocumentName = String.valueOf(scriptEngine .eval("encodeURIComponent('" + documentName + "')")); String safeURL = partialURL + urlSafeDocumentName; return safeURL; } public static void main(String[] args) { EncodeURIComponentDemo demo = new EncodeURIComponentDemo(); String partialURL = "https://www.website.com/document/"; String documentName = "Tom & Jerry Manuscript.pdf"; try { System.out.println(demo.buildSafeURL(partialURL, documentName)); } catch (ScriptException se) { se.printStackTrace(); } } 

आउटपुट: https://www.website.com/document/Tom%20%26%20Jerry%20Manuscript.pdf

यह लॉरेन शैकिपोग्ना द्वारा टिप्पणियों में फांसी के सवाल का उत्तर भी देता है कि कैसे स्ट्रिंग चर को एन्कोडुरिक कॉम्प्लेन्ट encodeURIComponent() । विधि scriptEngine.eval() एक Object देता है, इसलिए इसे स्ट्रिंग के माध्यम से स्ट्रिंग. String.valueOf() माध्यम से अन्य विधियों में कनवर्ट किया जा सकता है।

मेरे लिए यह काम किया:

 import org.apache.http.client.utils.URIBuilder; String encodedString = new URIBuilder() .setParameter("i", stringToEncode) .build() .getRawQuery() // output: i=encodedString .substring(2); 

या एक अलग UriBuilder के साथ

 import javax.ws.rs.core.UriBuilder; String encodedString = UriBuilder.fromPath("") .queryParam("i", stringToEncode) .toString() // output: ?i=encodedString .substring(3); 

मेरी राय में मानक लाइब्रेरी का उपयोग करना मैन्युअल रूप से पोस्टिंग के बजाय बेहतर विचार है @ क्रिस के उत्तर भी अच्छे दिखते हैं, लेकिन यह यूआरएल के लिए काम नहीं करता, जैसे " http: // a + b c.html"

पेरू लाइब्रेरी में प्रतिएन्सेस्पेपर है:

Escaper percentEscaper = new PercentEscaper("-_.*", false);

"-_। *" सुरक्षित वर्ण हैं

झूठी '% 20' के साथ अंतरिक्ष से बचने के लिए प्रतिसेकसी का कहना है, नहीं '+'