संसाधन गुण के साथ संसाधन गुणों में UTF-8 का उपयोग कैसे करें


259

मुझे जावा के उपयोग से अपने संसाधन गुणों में UTF-8 का उपयोग करने की आवश्यकता है ResourceBundle। जब मैं सीधे गुण फ़ाइल में पाठ दर्ज करता हूं, तो यह mojibake के रूप में प्रदर्शित होता है।

मेरा ऐप Google ऐप इंजन पर चलता है।

क्या कोई मुझे एक उदाहरण दे सकता है? मुझे यह काम नहीं मिल रहा है।


1
जावा 1.6 आप एक रीडर में पास कर सकते हैं। नीचे @Chinaxing उत्तर मार्ग देखें
विल 21

1
@Will: सवाल मुख्य रूप से उन्हें पढ़ने के बारे में है java.util.ResourceBundle, नहीं java.util.Properties
बालुसक

1
इस उत्तर दिए गए प्रश्न की जांच करें ,,, आशा है कि यह आपकी मदद करता है [ stackoverflow.com/questions/863838/… [1]: stackoverflow.com/questions/863838/…
मेजर प्रोग्रामर Bboy

6
JDK9 को मूल रूप से UTF-8 का समर्थन करना चाहिए, JEP 226
पाओलो फुलगोनी

जवाबों:


374

जब कोई फ़ाइल निर्दिष्ट की जाती है तो ResourceBundle#getBundle()कवर के नीचे का उपयोग । यह बदले में उन संपत्तियों की फाइलों को लोड करने के लिए डिफ़ॉल्ट रूप से उपयोग करता है । जावाडॉक के अनुसार , वे आईएसओ-8859-1 के रूप में डिफ़ॉल्ट रूप से पढ़े जाते हैं।PropertyResourceBundle.propertiesProperties#load(InputStream)

public void load(InputStream inStream) throws IOException

इनपुट बाइट स्ट्रीम से एक संपत्ति सूची (कुंजी और तत्व जोड़े) पढ़ता है। इनपुट स्ट्रीम एक सरल रेखा-उन्मुख प्रारूप में है जैसा कि लोड (रीडर) में निर्दिष्ट है और इसे आईएसओ 8859-1 वर्ण एन्कोडिंग का उपयोग करने के लिए माना जाता है ; प्रत्येक बाइट एक लैटिन 1 वर्ण है। लैटिन 1 में वर्ण नहीं, और कुछ विशेष वर्ण, यूनिकोड के उपयोग की कुंजी और तत्वों में दर्शाए गए हैं जैसा कि जावा ™ भाषा विनिर्देश के अनुभाग 3.3 में परिभाषित किया गया है।

इसलिए, आपको उन्हें ISO-8859-1 के रूप में सहेजना होगा। यदि आपके पास ISO-8859-1 श्रेणी से परे कोई भी वर्ण है और आप \uXXXXशीर्ष के ऊपर का उपयोग नहीं कर सकते हैं और आप इस प्रकार फ़ाइल को UTF-8 के रूप में सहेजने के लिए मजबूर हैं, तो आपको कनवर्ट करने के लिए native2ascii टूल का उपयोग करना होगा UTF-8 ने गुणनफल फ़ाइल को ISO-8859-1 सहेजी गई संपत्तियों की फाइल में रखा है, जिसमें सभी अनलॉक किए गए अक्षर \uXXXXप्रारूप में परिवर्तित हो जाते हैं । निम्न उदाहरण एक UTF-8 एन्कोडेड प्रॉपर्टीज़ फ़ाइल text_utf8.propertiesको एक मान्य ISO-8859-1 एन्कोडेड प्रॉपर्टीज़ फ़ाइल में कनवर्ट करता है text.properties

native2ascii -encoding UTF-8 text_utf8.properties text.properties

एक ग्रहण आईडीई जैसे ग्रहण का उपयोग करते समय, यह पहले से ही स्वचालित रूप से किया जाता है जब आप .propertiesएक जावा आधारित परियोजना में एक फ़ाइल बनाते हैं और ग्रहण के अपने संपादक का उपयोग करते हैं। ग्रहण आईएसओ-8859-1 रेंज से परे के पात्रों को पारदर्शी रूप से \uXXXXप्रारूपित करेगा। नीचे स्क्रीनशॉट भी देखें (नीचे "गुण" और "स्रोत" टैब पर ध्यान दें, बड़े के लिए क्लिक करें):

"गुण" टैब "स्रोत" टैब

वैकल्पिक रूप से, आप एक कस्टम ResourceBundle.Controlकार्यान्वयन भी बना सकते हैं जिसमें आप यूटीएफ -8 के रूप में संपत्तियों की फाइलों को स्पष्ट रूप से पढ़ InputStreamReaderसकते हैं, ताकि आप उन्हें बिना परेशानी के जरूरत के बिना यूटीएफ -8 के रूप में बचा सकें native2ascii। यहां एक किकऑफ उदाहरण दिया गया है:

public class UTF8Control extends Control {
    public ResourceBundle newBundle
        (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
            throws IllegalAccessException, InstantiationException, IOException
    {
        // The below is a copy of the default implementation.
        String bundleName = toBundleName(baseName, locale);
        String resourceName = toResourceName(bundleName, "properties");
        ResourceBundle bundle = null;
        InputStream stream = null;
        if (reload) {
            URL url = loader.getResource(resourceName);
            if (url != null) {
                URLConnection connection = url.openConnection();
                if (connection != null) {
                    connection.setUseCaches(false);
                    stream = connection.getInputStream();
                }
            }
        } else {
            stream = loader.getResourceAsStream(resourceName);
        }
        if (stream != null) {
            try {
                // Only this line is changed to make it to read properties files as UTF-8.
                bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
            } finally {
                stream.close();
            }
        }
        return bundle;
    }
}

इसका उपयोग इस प्रकार किया जा सकता है:

ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());

यह सभी देखें:


धन्यवाद। BTW यह FORMAT_PROPERTIES को वापस करने के लिए getFormats को ओवरराइड करने के लिए एक अच्छा विचार है।
फ्लेवियो एट्रूस्को

GetFormats () को ओवरराइड करने के लिए क्या आप इस सुझाव पर विस्तार से बता सकते हैं?
मार्क रोपर

1
@ imgx64: सूचित करने के लिए धन्यवाद। उत्तर तय हो गया है।
BalusC

10
StandardCharsets.UTF_8यदि आपका जावा 7+
निक्स

1
@ नायरगुड्स: यदि आप कभी भी प्रोग्राम बदलने के कारण देखते हैं (मैं जीवन की कल्पना नहीं कर सकता हालांकि), ऐसा करने के लिए स्वतंत्र महसूस करें। सभी कोड स्निपेट I पोस्ट सभी के बाद सिर्फ किकऑफ उदाहरण हैं।
BalusC

131

यह देखते हुए कि आपके पास ResourceBundle का एक उदाहरण है और आप String by:

String val = bundle.getString(key); 

मैंने अपनी जापानी प्रदर्शन समस्या हल की:

return new String(val.getBytes("ISO-8859-1"), "UTF-8");

36
सभी भोले-भाले लोगों / टिप्पणीकारों के लिए यहां: यह कोई समाधान नहीं है, बल्कि एक समाधान है। सही अंतर्निहित समस्या अभी भी खड़ी है और समाधान की आवश्यकता है।
बालुसक

2
इससे मेरी स्थिति ठीक हो गई। जावा के लिए समाधान संसाधन बंडलों और संपत्तियों की फाइलों में मूल रूप से UTF-8 को संभालने के लिए होगा। जब तक ऐसा नहीं होता मैं वर्कअराउंड का उपयोग करूंगा।
JohnRDOrazio

@BalusC; इस दृष्टिकोण का नुकसान क्या है? (एक अतिरिक्त स्ट्रिंग बनाने के अलावा?)
पास्के

8
@ पासाके: यह एक समाधान है, समाधान नहीं। आपको कोड आधार पर सभी स्ट्रिंग चर पर सभी जगह पर पुन: लागू करने की आवश्यकता होगी। यह शुद्ध बकवास है। बस इसे एक ही स्थान पर, सही स्थान पर ठीक करें ताकि स्ट्रिंग चर में तुरंत सही मान हो। क्लाइंट को संशोधित करने की कोई आवश्यकता नहीं होनी चाहिए।
बालुसक

3
हां, यदि आपको संपूर्ण एप्लिकेशन को संशोधित करना है, तो निश्चित रूप से यह खराब है। लेकिन अगर आप पहले से ही एक सिंगलटन के रूप में रिसोर्सबंड का उपयोग कर रहे हैं तो आपको केवल एक बार इसे ठीक करना होगा। मैं इस धारणा के तहत था कि सिंगलटन दृष्टिकोण रिसोर्सबंडल का उपयोग करने का सबसे आम तरीका था।
पासाके

50

इसे देखें: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)

गुण एक रीडर ऑब्जेक्ट को तर्कों के रूप में स्वीकार करते हैं , जिसे आप एक इनपुटस्ट्रीम से बना सकते हैं।

बनाने के समय में, आप रीडर की एन्कोडिंग निर्दिष्ट कर सकते हैं:

InputStreamReader isr = new InputStreamReader(stream, "UTF-8");

फिर इस रीडर को लोड विधि पर लागू करें:

prop.load(isr);

BTW: .properties फ़ाइल से स्ट्रीम प्राप्त करें :

 InputStream stream = this.class.getClassLoader().getResourceAsStream("a.properties");

BTW: से संसाधन बंडल प्राप्त करें InputStreamReader:

ResourceBundle rb = new PropertyResourceBundle(isr);

आशा है इससे आपको सहायता मिलेगी !


3
ResourceBundleहालांकि यहां वास्तविक प्रश्न है ।
Nyerguds

1
सच है, यह स्वीकार किया जाना चाहिए जवाब अगर आप उपयोग कर रहे हैं Propertiesऔर आप UTF-8स्ट्रिंग को पुनः प्राप्त करना चाहते हैं तो यह एक आकर्षण की तरह काम करता है। हालाँकि ResourceBundleइस तरह के भाषा संसाधनों के लिए तो स्वीकृत जवाब सुरुचिपूर्ण है। फिर भी ऊपर वाले ने जवाब दिया।
इल्गिट येल्ड्रिम

ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
15

22

ResourceBundle.Control यदि उदाहरण के लिए गुण फ़ाइल cp1251 charset का उपयोग करता है, तो UTF-8 और नए स्ट्रिंग विधियों से काम नहीं चलता है।

इसलिए मैंने एक सामान्य विधि का उपयोग करके पुन: प्रवेश किया: यूनिकोड प्रतीकों में लिखें । इसके लिए:

IDEA - एक विशेष " पारदर्शी देशी-से-ASCII रूपांतरण " विकल्प (सेटिंग्स> फ़ाइल एन्कोडिंग) है।

ग्रहण - एक प्लगइन " गुण संपादक " है । यह अलग एप्लिकेशन के रूप में काम कर सकता है।


3
IntelliJ IDEA 14 में, यह सेटिंग्स -> संपादक -> फ़ाइल एन्कोडिंग में स्थित है। मुझे किसी भी मौजूदा प्रॉपर्टी फाइल को डिलीट करना था, और इस विकल्प को प्रभावी बनाने के लिए उन्हें फिर से बनाना था।
साइफ्रे

आईडीई जवाब के लिए विशेष रूप से प्रासंगिक नहीं है, लेकिन सिर्फ उपकरण जो वास्तव में UTF-8 चरित्र-सेट में सामग्री को संग्रहीत न करने की अंतर्निहित समस्या को संबोधित नहीं करते हैं .... जो समस्या को सीधे रूप से हल करेंगे या लेखन गुण जैसे हैकरी के बिना। एक अलग वर्ण सेट के साथ परिभाषित फ़ाइल के अंदर यूनिकोड प्रतीकों में।
डेरेल टेग्यू

21

यह समस्या अंततः जावा 9 में तय की गई है: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9

गुण फ़ाइलों के लिए डिफ़ॉल्ट एन्कोडिंग अब UTF-8 है।

अधिकांश मौजूदा संपत्तियों की फाइलें प्रभावित नहीं होनी चाहिए: UTF-8 और ISO-8859-1 में ASCII वर्णों के लिए समान एन्कोडिंग है, और मानव-पठनीय गैर-ASCII ISO-8859-1 एन्कोडिंग मान्य UTF-8 नहीं है। यदि एक अमान्य UTF-8 बाइट अनुक्रम का पता लगाया जाता है, तो जावा रनटाइम ISO-8859-1 में स्वचालित रूप से फ़ाइल को फिर से लोड करता है।


19

हम एक resource.utf8 फ़ाइल बनाते हैं जिसमें UTF-8 में संसाधन होते हैं और इसमें निम्नलिखित नियम होते हैं:

native2ascii -encoding utf8 resources.utf8 resources.properties

हम कहां native2asciiसे लाएं? मैंने सिर्फ किया find / -name native2ascii*और कोई परिणाम नहीं मिला, इसलिए मुझे लगता है कि यह सिर्फ JDK का हिस्सा नहीं है ...
ArtOfWarfare

हम्म। यह IBM JDK का हिस्सा नहीं है, लेकिन यह Oracle JDK में शामिल किया गया है jdk1.*.0_*/bin
आर्टऑफवर्फ

यह आईबीएम JDK का हिस्सा प्रतीत होता है, कम से कम JDK 6. में
एरिक फिन

19
package com.varaneckas.utils;  

import java.io.UnsupportedEncodingException;  
import java.util.Enumeration;  
import java.util.PropertyResourceBundle;  
import java.util.ResourceBundle;  

/** 
 * UTF-8 friendly ResourceBundle support 
 *  
 * Utility that allows having multi-byte characters inside java .property files. 
 * It removes the need for Sun's native2ascii application, you can simply have 
 * UTF-8 encoded editable .property files. 
 *  
 * Use:  
 * ResourceBundle bundle = Utf8ResourceBundle.getBundle("bundle_name"); 
 *  
 * @author Tomas Varaneckas <tomas.varaneckas@gmail.com> 
 */  
public abstract class Utf8ResourceBundle {  

    /** 
     * Gets the unicode friendly resource bundle 
     *  
     * @param baseName 
     * @see ResourceBundle#getBundle(String) 
     * @return Unicode friendly resource bundle 
     */  
    public static final ResourceBundle getBundle(final String baseName) {  
        return createUtf8PropertyResourceBundle(  
                ResourceBundle.getBundle(baseName));  
    }  

    /** 
     * Creates unicode friendly {@link PropertyResourceBundle} if possible. 
     *  
     * @param bundle  
     * @return Unicode friendly property resource bundle 
     */  
    private static ResourceBundle createUtf8PropertyResourceBundle(  
            final ResourceBundle bundle) {  
        if (!(bundle instanceof PropertyResourceBundle)) {  
            return bundle;  
        }  
        return new Utf8PropertyResourceBundle((PropertyResourceBundle) bundle);  
    }  

    /** 
     * Resource Bundle that does the hard work 
     */  
    private static class Utf8PropertyResourceBundle extends ResourceBundle {  

        /** 
         * Bundle with unicode data 
         */  
        private final PropertyResourceBundle bundle;  

        /** 
         * Initializing constructor 
         *  
         * @param bundle 
         */  
        private Utf8PropertyResourceBundle(final PropertyResourceBundle bundle) {  
            this.bundle = bundle;  
        }  

        @Override  
        @SuppressWarnings("unchecked")  
        public Enumeration getKeys() {  
            return bundle.getKeys();  
        }  

        @Override  
        protected Object handleGetObject(final String key) {  
            final String value = bundle.getString(key);  
            if (value == null)  
                return null;  
            try {  
                return new String(value.getBytes("ISO-8859-1"), "UTF-8");  
            } catch (final UnsupportedEncodingException e) {  
                throw new RuntimeException("Encoding not supported", e);  
            }  
        }  
    }  
}  

1
मुझे यह समाधान पसंद है और मैं इसे Gist.github.com/enginer/3168dd4a374994718f0e
Sllouyssgort

यह बहुत अच्छा काम करता है। बस UTF8 में एक चीनी अनुवाद गुण फ़ाइल जोड़ा गया है और यह बिना किसी समस्या के लोड होता है।
tresf

9

ध्यान दें: जावा संपत्ति फ़ाइलों को आईएसओ 8859-1 में एन्कोड किया जाना चाहिए!

आईएसओ 8859-1 वर्ण एन्कोडिंग। वर्ण जो इस एन्कोडिंग में सीधे प्रतिनिधित्व नहीं कर सकते हैं, उन्हें यूनिकोड एस्केप का उपयोग करके लिखा जा सकता है; भागने के क्रम में केवल एक 'यू' वर्ण की अनुमति है।

@ डॉट गुण जावा डॉक्टर

यदि आप अभी भी वास्तव में ऐसा करना चाहते हैं: इस पर एक नज़र डालें: ग्रहण में जावा गुण UTF-8 एन्कोडिंग - कुछ कोड नमूने हैं


1
जावा! = ग्रहण ... उत्तरार्द्ध एक आईडीई है। आगे डेटा! = जावा। जावा चरित्र सेट के एक विशाल सरणी का उपयोग करके स्ट्रीम प्रोसेसिंग का समर्थन करता है, जो कि अंतर्राष्ट्रीयकरण के लिए है (सवाल सभी के बाद रिसोर्सबंडल्स के बारे में है) ... यूटीएफ -8 को सबसे सीधे-सीधे उत्तर के रूप में उपयोग करने का संकल्प करता है। एक चरित्र सेट में संपत्ति फ़ाइलों को लक्ष्य भाषा द्वारा समर्थित नहीं लिखना अनावश्यक रूप से समस्या को जटिल करता है।
डेरेल टेग्यू

@ डेरेल टीग्यू: "हंट" जो कि रेसुबसंडल के लिए लोड की गई प्रॉपर फाइल है, आईएसओ 8859-1 एक जावा स्टेटमेंट है: docs.oracle.com/javase/8/docs/api/java/util/… .. । मेरे जवाब का दूसरा हिस्सा सिर्फ एक "संकेत" है कि टोपी की समस्या से कैसे निपटा जाए।
राल्फ

5

http://sourceforge.net/projects/eclipse-rbe/

जैसा कि पहले ही कहा गया है कि संपत्ति की फाइलें आईएसओ 8859-1 में एनकोड की जानी चाहिए

आप अपने लिए यूनिकोड रूपांतरण बनाने के लिए ग्रहण आईडीई के लिए उपरोक्त प्लगइन का उपयोग कर सकते हैं।


3

यहां जावा 7 सॉल्यूशन दिया गया है जो अमरूद की शानदार सपोर्ट लाइब्रेरी और ट्राय-विथ रिसोर्स कंस्ट्रक्शन का उपयोग करता है। यह सरलतम समग्र अनुभव के लिए UTF-8 का उपयोग करते हुए गुण फ़ाइलों को पढ़ता है और लिखता है।

गुण फ़ाइल को UTF-8 के रूप में पढ़ने के लिए:

File file =  new File("/path/to/example.properties");

// Create an empty set of properties
Properties properties = new Properties();

if (file.exists()) {

  // Use a UTF-8 reader from Guava
  try (Reader reader = Files.newReader(file, Charsets.UTF_8)) {
    properties.load(reader);
  } catch (IOException e) {
    // Do something
  }
}

गुण फ़ाइल को UTF-8 के रूप में लिखने के लिए:

File file =  new File("/path/to/example.properties");

// Use a UTF-8 writer from Guava
try (Writer writer = Files.newWriter(file, Charsets.UTF_8)) {
  properties.store(writer, "Your title here");
  writer.flush();
} catch (IOException e) {
  // Do something
}

यह उत्तर उपयोगी है। यहां विभिन्न समस्याओं के साथ मुख्य समस्या डेटा और चरित्र सेट के बारे में गलतफहमी प्रतीत होती है। जावा किसी भी डेटा (सही ढंग से) को केवल उस वर्ण को निर्दिष्ट करके पढ़ सकता है जिसे वह ऊपर दिखाए अनुसार संग्रहीत किया गया था। UTF-8 आमतौर पर सबसे अधिक समर्थन करने के लिए उपयोग किया जाता है यदि ग्रह पर हर भाषा नहीं है और इसलिए रिसोर्सबंडल आधारित गुणों के लिए बहुत अधिक लागू है।
डैरेल टीग्यू

@DarrellTeague: खैर, "UTF-8 का आमतौर पर समर्थन करने के लिए उपयोग किया जाता है ..." - बल्कि होना चाहिए " यूनिकोड का आमतौर पर समर्थन किया जाता है ..." :) के रूप में UTF-8 यूनिकोड ( en .wikipedia.org / wiki / UTF-8 )।
होन्ज़ा ज़िदेक

वास्तव में UTF-8 को विशेष रूप से "वर्ण सेट" कहा जाता था (इस संदर्भ में (डेटा) यूटीएफ -8 के रूप में केवल किसी भी यूनिकोड वर्ण सेट को संदर्भित किया जाता है (डेटा) कुछ उपायों द्वारा इंटरनेट पर उपयोग के रूप में उच्च के रूप में प्रयोग किया जाता है। 67%। Ref: stackoverflow.com/questions/8509339/…
डैरेल टेग

3

जैसा कि एक ने सुझाव दिया, मैं संसाधन बंडल के कार्यान्वयन से गुज़रा .. लेकिन इससे कोई मदद नहीं मिली .. क्योंकि बंडल को हमेशा en_US लोकेल के अंतर्गत कहा जाता था ... मैंने अपने डिफ़ॉल्ट लोकेल को एक अलग भाषा में सेट करने की कोशिश की और फिर भी संसाधन बंडल का मेरा कार्यान्वयन नियंत्रण को en_US के साथ कॉल किया जा रहा था ... मैंने लॉग संदेश डालने और डीबग के माध्यम से एक चरण करने की कोशिश की और देखें कि क्या मैं xhtml और JSF कॉल के माध्यम से रन समय में लोकेल बदलने के बाद एक अलग स्थानीय कॉल किया जा रहा था ... जो कि ख़ुशी नहीं हुई ... तब मैंने अपने सर्वर (टॉमकैट सर्वर) द्वारा फाइलों को पढ़ने के लिए एक utf8 के लिए एक सिस्टम सेट डिफॉल्ट करने की कोशिश की .. लेकिन यह सर्वनाम है क्योंकि मेरे सभी कक्षा के पुस्तकालयों को utf8 के तहत संकलित नहीं किया गया था और टॉमकैट तब utf8 प्रारूप में पढ़ना शुरू कर दिया था और सर्वर ठीक से नहीं चल रहा था ... तो मैं अपने java कंट्रोलर में एक विधि को लागू करने के साथ समाप्त हो गया जिसे xhtml फ़ाइलों से बुलाया जाना था।उस विधि में मैंने निम्नलिखित कार्य किया:

        public String message(String key, boolean toUTF8) throws Throwable{
            String result = "";
            try{
                FacesContext context = FacesContext.getCurrentInstance();
                String message = context.getApplication().getResourceBundle(context, "messages").getString(key);

                result = message==null ? "" : toUTF8 ? new String(message.getBytes("iso8859-1"), "utf-8") : message;
            }catch(Throwable t){}
            return result;
        }

मैं विशेष रूप से घबरा गया था क्योंकि यह मेरे आवेदन के प्रदर्शन को धीमा कर सकता है ... हालांकि, इसे लागू करने के बाद, ऐसा लगता है जैसे कि मेरा आवेदन अब तेज है .. मुझे लगता है कि यह इसलिए है, क्योंकि मैं अब सीधे जाने के बजाय गुणों का उपयोग कर रहा हूं JSF संपत्तियों तक पहुंचने में अपना रास्ता पार कर लेता है ... मैं विशेष रूप से इस कॉल में बूलियन तर्क पास करता हूं क्योंकि मुझे पता है कि कुछ गुणों का अनुवाद नहीं किया जाएगा और utf8 प्रारूप में होने की आवश्यकता नहीं है ...

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


2
Properties prop = new Properties();
String fileName = "./src/test/resources/predefined.properties";
FileInputStream inputStream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(inputStream,"UTF-8");

1

यह जो मेरे मुद्दे के लायक है, वह यह था कि फाइलें स्वयं गलत एन्कोडिंग में थीं। आइकनव का उपयोग करना मेरे लिए काम कर गया

iconv -f ISO-8859-15 -t UTF-8  messages_nl.properties > messages_nl.properties.new

उल्लेख करने के लिए +1 iconv। मैंने इसके बारे में पहले कभी नहीं सुना है, लेकिन मैंने इसे कंसोल और लो और निहारना में टाइप किया, यह एक ऐसी चीज है जो मौजूद है (CentOS 6, वैसे भी।)
ArtOfWarfare

अब जब कि मैंने वास्तव में इसका उपयोग करने की कोशिश की है, हालांकि यह काम नहीं किया: यह पहले चरित्र पर फेंक दिया जो आईएसओ-8559-1 में परिवर्तित नहीं किया जा सका।
आर्टऑफवर्फ

1

मैंने रॉड द्वारा प्रदान किए गए दृष्टिकोण का उपयोग करने की कोशिश की, लेकिन सभी आवेदन में एक ही काम के आसपास नहीं दोहराने के बारे में बालुसक चिंता को ध्यान में रखते हुए इस वर्ग के साथ आया:

import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyResourceBundle {

    // feature variables
    private ResourceBundle bundle;
    private String fileEncoding;

    public MyResourceBundle(Locale locale, String fileEncoding){
        this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
        this.fileEncoding = fileEncoding;
    }

    public MyResourceBundle(Locale locale){
        this(locale, "UTF-8");
    }

    public String getString(String key){
        String value = bundle.getString(key); 
        try {
            return new String(value.getBytes("ISO-8859-1"), fileEncoding);
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
}

इसका उपयोग करने का तरीका नियमित रिसोर्सबंड के उपयोग से बहुत समान होगा:

private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)

या आप वैकल्पिक कंस्ट्रक्टर का उपयोग कर सकते हैं जो डिफ़ॉल्ट रूप से UTF-8 का उपयोग करता है:

private MyResourceBundle labels = new MyResourceBundle("es");

0

सेटिंग्स / प्राथमिकताएं संवाद ( Ctrl+ Alt+ S) खोलें , फिर संपादक और फ़ाइल एन्कोडिंग पर क्लिक करें।

विंडो का स्क्रीनशॉट दिखाया गया है

फिर, तल पर, आप गुणों की फ़ाइलों के लिए डिफ़ॉल्ट एन्कोडिंग करेंगे। अपना एन्कोडिंग प्रकार चुनें।

वैकल्पिक रूप से आप अपने संसाधन बंडल में उदाहरण के लिए यूनिकोड प्रतीकों का उपयोग कर सकते हैं (उदाहरण के लिए "ів"बराबर \u0456\u0432)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.