दिलचस्प पोस्ट
फ़ाइल नाम से निर्देशिका नाम प्राप्त करना क्लास के भीतर एक टेम्पलेट फ़ंक्शन कैसे बनाएं? (C ++) आगे c ++ में एक एन्यूम घोषित कर रहा है वापसी कुंजी के रूप में "अगला" का उपयोग करना आईओएस 4: ओपनजीएल बनावट के रूप में मैं वीडियो फ़ाइल का उपयोग कैसे करूं? डीजेंगो के auth_user.username varchar (75) हो सकता है? यह कैसे किया जा सकता है? com.android.builder.packaging.DuplicateFileException: डुप्लिकेट फ़ाइलें एपीके मेटा- INF / maven / com.fasterxml.jackson.core / jackson-databind / pom.xml में कॉपी की गईं एलएलवीएम आईआर में मशीन कोड का अनुवाद (एक्सएमसीएफ़ / एक्सएमसीएक्स के एक्स 86_64 x86। एआरएम एलएलवीएम बिटकोड में) Google Chrome ऑटो अपडेट को अक्षम कैसे करें? क्लाइंट ब्राउज़र से अमेज़ॅन एस 3 सीधी फाइल अपलोड – निजी कुंजी प्रकटन strcmp () सी में वापसी मान मैं एक फार्म पर सभी चेकबॉक्स के माध्यम से कैसे पुनरावृत्त हो सकता हूं? अनक्यूट टाइप एरर: fs.readFileSync एक फ़ंक्शन नहीं है दूरस्थ एसक्यूएल डाटाबेस तक एंड्रॉइड एक्सेस सीएसएस ट्रांसफ़ॉर्म, क्रोम में दांतेदार किनारों

जावा में डिफ़ॉल्ट वर्णसेट / एन्कोडिंग कैसे खोजें?

स्पष्ट जवाब Charset.defaultCharset() का उपयोग Charset.defaultCharset() लेकिन हमने हाल ही में यह पाया है कि यह सही जवाब नहीं है। मुझे बताया गया था कि परिणाम कई अवसरों में जावा.ओ कक्षाओं द्वारा उपयोग किए जाने वाले वास्तविक डिफ़ॉल्ट वर्णसेट से भिन्न है। ऐसा लगता है कि जावा डिफ़ॉल्ट वर्णसेट के 2 सेट रखता है। क्या किसी को इस मुद्दे पर कोई अंतर्दृष्टि है?

हम एक विफल मामला पुन: उत्पन्न करने में सक्षम थे। यह एक प्रकार की उपयोगकर्ता त्रुटि है लेकिन यह अभी भी अन्य सभी समस्याओं के मूल कारण को बेनकाब कर सकती है यहां कोड है,

 public class CharSetTest { public static void main(String[] args) { System.out.println("Default Charset=" + Charset.defaultCharset()); System.setProperty("file.encoding", "Latin-1"); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("Default Charset in Use=" + getDefaultCharSet()); } private static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); return enc; } } 

किसी लीगेसी प्रोटोकॉल में कुछ मिश्रित एन्कोडिंग (एएनएसआई / लैटिन -1 / यूटीएफ -8) से निपटने के लिए हमारे सर्वर को लैटिन -1 में डिफ़ॉल्ट वर्णसेट की आवश्यकता है। तो हमारे सभी सर्वर इस जेवीएम पैरामीटर के साथ चलते हैं,

 -Dfile.encoding=ISO-8859-1 

यहां पर जावा 5 का नतीजा है,

 Default Charset=ISO-8859-1 file.encoding=Latin-1 Default Charset=UTF-8 Default Charset in Use=ISO8859_1 

कोई भी कोड में file.encoding सेट करके एन्कोडिंग रनटाइम को बदलने की कोशिश करता है। हम सभी जानते हैं कि काम नहीं करता है हालांकि, यह जाहिरा तौर पर डिफ़ॉल्टCharset () से फेंकता है लेकिन यह आउटपुटस्ट्रीम वाइटर द्वारा उपयोग किए गए वास्तविक डिफ़ॉल्ट वर्णसेट को प्रभावित नहीं करता है।

क्या यह एक बग या सुविधा है?

संपादित करें: स्वीकृत जवाब इस समस्या के मूल कारण को दर्शाता है। असल में, आप जावा 5 में डिफ़ॉल्टCharset () पर भरोसा नहीं कर सकते, जो कि I / O वर्गों द्वारा प्रयुक्त डिफ़ॉल्ट एन्कोडिंग नहीं है। ऐसा लगता है कि जावा 6 इस समस्या को ठीक करता है

Solutions Collecting From Web of "जावा में डिफ़ॉल्ट वर्णसेट / एन्कोडिंग कैसे खोजें?"

यह वास्तव में अजीब है … एक बार सेट होने पर, डिफ़ॉल्ट वर्णसेट कैश्ड किया जाता है और क्लास मेमोरी में है, जबकि इसे बदला नहीं है। "file.encoding" System.setProperty("file.encoding", "Latin-1"); साथ "file.encoding" प्रॉपर्टी सेट करना System.setProperty("file.encoding", "Latin-1"); कुछ नहीं करता। हर बार Charset.defaultCharset() कहा जाता है यह कैश्ड वर्णसेट देता है।

यहां मेरे परिणाम हैं:

 Default Charset=ISO-8859-1 file.encoding=Latin-1 Default Charset=ISO-8859-1 Default Charset in Use=ISO8859_1 

मैं हालांकि जेवीएम 1.6 का उपयोग कर रहा हूं।

(अद्यतन करें)

ठीक। मैंने आपके बग को JVM 1.5 के साथ पुन: उत्पन्न किया।

1.5 के स्रोत कोड को देखते हुए, कैश्ड डिफ़ॉल्ट वर्णसेट सेट नहीं किया जा रहा है। मुझे नहीं पता कि यह बग है या नहीं, लेकिन 1.6 इस कार्यान्वयन को बदलता है और कैश्ड वर्णसेट का उपयोग करता है:

जेवीएम 1.5:

 public static Charset defaultCharset() { synchronized (Charset.class) { if (defaultCharset == null) { java.security.PrivilegedAction pa = new GetPropertyAction("file.encoding"); String csn = (String)AccessController.doPrivileged(pa); Charset cs = lookup(csn); if (cs != null) return cs; return forName("UTF-8"); } return defaultCharset; } } 

जेवीएम 1.6:

 public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { java.security.PrivilegedAction pa = new GetPropertyAction("file.encoding"); String csn = (String)AccessController.doPrivileged(pa); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; } 

अगली बार जब आप Charset.defaultCharset() कॉल Charset.defaultCharset() तो file.encoding=Latin-1 फ़ाइल एन्कोडिंग सेट करते हैं, तो क्या होता है, क्योंकि कैश्ड डिफ़ॉल्ट वर्णसेट सेट नहीं है, यह नाम के लिए उपयुक्त वर्णसेट खोजने का प्रयास करेगा Latin-1 यह नाम नहीं मिला है, क्योंकि यह गलत है, और डिफ़ॉल्ट UTF-8 लौटाता है

के लिए क्यों IO कक्षाएं जैसे OutputStreamWriter एक अप्रत्याशित परिणाम लौटाते हैं,
sun.nio.cs.StreamEncoder के कार्यान्वयन। sun.nio.cs.StreamEncoder (डायन इन आईओ वर्गों द्वारा उपयोग किया जाता है) JVM 1.5 और JVM 1.6 के लिए भी अलग है। JVM 1.6 कार्यान्वयन Charset.defaultCharset() प्राप्त करने के लिए Charset.defaultCharset() विधि में आधारित है, अगर कोई IO वर्गों को प्रदान नहीं किया गया है। JVM 1.5 कार्यान्वयन एक अलग विधि का उपयोग करता है Converters.getDefaultEncodingName(); डिफ़ॉल्ट वर्णसेट प्राप्त करने के लिए यह विधि इसका डिफ़ॉल्ट कैरेट का स्वयं का कैश उपयोग करती है जो कि JVM प्रारंभ पर सेट है:

जेवीएम 1.6:

  public static StreamEncoder forOutputStreamWriter(OutputStream out, Object lock, String charsetName) throws UnsupportedEncodingException { String csn = charsetName; if (csn == null) csn = Charset.defaultCharset().name(); try { if (Charset.isSupported(csn)) return new StreamEncoder(out, lock, Charset.forName(csn)); } catch (IllegalCharsetNameException x) { } throw new UnsupportedEncodingException (csn); } 

जेवीएम 1.5:

 public static StreamEncoder forOutputStreamWriter(OutputStream out, Object lock, String charsetName) throws UnsupportedEncodingException { String csn = charsetName; if (csn == null) csn = Converters.getDefaultEncodingName(); if (!Converters.isCached(Converters.CHAR_TO_BYTE, csn)) { try { if (Charset.isSupported(csn)) return new CharsetSE(out, lock, Charset.forName(csn)); } catch (IllegalCharsetNameException x) { } } return new ConverterSE(out, lock, csn); } 

लेकिन मैं टिप्पणी से सहमत हूं आपको इस संपत्ति पर भरोसा नहीं करना चाहिए । यह एक कार्यान्वयन विवरण है

क्या यह एक बग या सुविधा है?

ऐसा लगता है कि अपरिभाषित व्यवहार मुझे पता है कि, व्यवहार में, आप कमांड-लाइन प्रॉपर्टी का उपयोग करके डिफ़ॉल्ट एन्कोडिंग बदल सकते हैं, लेकिन मुझे नहीं लगता कि जब आप ऐसा करते हैं तो क्या होता है

बग आईडी: 4153515 इस संपत्ति की सेटिंग में समस्याएं:

यह एक बग नहीं है। J2SE प्लेटफ़ॉर्म विनिर्देश द्वारा "file.encoding" संपत्ति की आवश्यकता नहीं है; यह सूर्य के कार्यान्वयन का एक आंतरिक विवरण है और इसे उपयोगकर्ता कोड द्वारा जांच या संशोधित नहीं किया जाना चाहिए। यह केवल पढ़ने के लिए ही करना है; इस संपत्ति की सेटिंग को कमांड लाइन पर मनमाना मूल्यों पर या प्रोग्राम निष्पादन के दौरान किसी भी अन्य समय में समर्थन करने के लिए तकनीकी रूप से असंभव है।

वीएम और रनटाइम सिस्टम द्वारा प्रयुक्त डिफ़ॉल्ट एन्कोडिंग को बदलने का पसंदीदा तरीका अपने जावा प्रोग्राम को शुरू करने से पहले अंतर्निहित प्लेटफॉर्म के लोकेल को बदलना है।

जब मैं लोगों को कमांड लाइन पर एन्कोडिंग सेट करता हूं – मुझे नहीं लगता कि आपको यह पता नहीं है कि किस कोड को प्रभावित करना है

यदि आप डिफ़ॉल्ट एन्कोडिंग का उपयोग नहीं करना चाहते हैं, तो एन्कोडिंग सेट करें जिसे आप स्पष्ट रूप से उचित विधि / कन्स्ट्रक्टर के माध्यम से करना चाहते हैं।

सबसे पहले, लैटिन -1 आईएसओ -8859-1 के समान है, इसलिए, डिफ़ॉल्ट आपके लिए पहले से ठीक था। सही?

आपने अपने कमांड लाइन पैरामीटर के साथ आईएसओ -8859-1 को एन्कोडिंग सफलतापूर्वक सेट कर दिया है। आप इसे "लैटिन-1" के लिए प्रोग्रामेटिक रूप से भी सेट करते हैं, लेकिन यह जावा के लिए फ़ाइल एन्कोडिंग का एक मान्य मान नहीं है। http://java.sun.com/javase/6/docs/technotes/guides/intl/encoding.doc.html देखें

जब आप ऐसा करते हैं, तो ऐसा लगता है कि स्रोत को देखने से, यूआरएफ -8 में वर्णसेट रीसेट करता है। यह कम से कम व्यवहार के अधिकांश बताते हैं।

मुझे नहीं पता क्यों आउटपुटस्ट्रीम वाइटर ISO8859_1 दिखाता है यह बंद-स्रोत सूरज के लिए प्रतिनिधि है। मिस्क। * कक्षाएं मुझे लग रहा है कि यह एक ही तंत्र के माध्यम से एन्कोडिंग से काफी निपटारा नहीं है, जो अजीब है

लेकिन निश्चित रूप से आपको यह निर्दिष्ट करना चाहिए कि इस कोड में आपके एन्कोडिंग क्या मतलब है। मैं प्लेटफ़ॉर्म डिफ़ॉल्ट पर भरोसा नहीं करता था

यह व्यवहार वास्तव में अजीब नहीं है कक्षाओं के कार्यान्वयन को देखते हुए, इसका कारण होता है:

  • Charset.defaultCharset () जावा 5 में निर्धारित वर्ण सेट को कैशिंग नहीं कर रहा है।
  • सिस्टम प्रॉपर्टी "file.encoding" की स्थापना करना और Charset.defaultCharset () को दोबारा करने से सिस्टम प्रॉपर्टी के दूसरे मूल्यांकन का कारण बनता है, नाम "लैटिन -1" के साथ कोई वर्ण सेट नहीं पाया जाता है, इसलिए Charset.defaultCharset डिफ़ॉल्ट "UTF-8 "।
  • आउटपुटस्ट्रीम वाइटर हालांकि डिफ़ॉल्ट वर्ण सेट को कैशिंग कर रहा है और शायद वीएम आरंभीकरण के दौरान पहले से ही उपयोग किया जाता है, ताकि इसका डिफ़ॉल्ट वर्ण सेट Charset.defaultCharset () से बदल जाए अगर सिस्टम गुण "file.encoding" रनटाइम पर बदल दिया गया है।

जैसा कि पहले से ही बताया गया है, यह दस्तावेज नहीं है कि वीएम को ऐसी स्थिति में कैसे व्यवहार करना चाहिए। वर्णसेट। डेफॉल्ट चार्जसेट () एपीआई दस्तावेज़ीकरण डिफ़ॉल्ट वर्ण सेट के निर्धारण के बारे में बिल्कुल सटीक नहीं है, केवल यह उल्लेख करते हुए कि यह आमतौर पर ओएस डिफ़ॉल्ट वर्ण सेट या डिफ़ॉल्ट लोकेल जैसी कारकों के आधार पर, वीएम स्टार्टअप पर किया जाता है

मैंने सर्वर के डिफ़ॉल्ट वर्ण सेट को बदलने के लिए WM सर्वर में vm तर्क को -file.encoding = UTF-8 सेट किया है I

चेक

 System.getProperty("sun.jnu.encoding") 

ऐसा लगता है कि आपके सिस्टम के कमांड लाइन में उपयोग किए जाने वाले एक ही एन्कोडिंग