রিসোর্সবাণ্ডল সহ কীভাবে ইউটিএফ -8 ব্যবহার করতে হবে


259

জাভা ব্যবহার করে আমার উত্স বৈশিষ্ট্যে ইউটিএফ -8 ব্যবহার করা দরকার ResourceBundle। আমি যখন প্রপার্টি ফাইলে পাঠ্যটি সরাসরি প্রবেশ করি তখন এটি মোজিবাকে প্রদর্শিত হয়।

আমার অ্যাপ্লিকেশন গুগল অ্যাপ ইঞ্জিনে চলে।

কেউ কি আমাকে উদাহরণ দিতে পারেন? আমি এই কাজ পেতে পারি না।


1
জাভা 1.6 আপনি কোনও পাঠকের মধ্যে যেতে পারার সাথে এটি স্থির করে। নীচে @ সিনাক্সিং উত্তরটি দেখুন
হবে

1
@ উইল: প্রশ্নটি মূলত সেগুলি পড়ার বিষয়ে java.util.ResourceBundle, না java.util.Properties
বালুসসি

1
এই উত্তরের প্রশ্নটি দেখুন ,,, আশা করি এটি আপনাকে সহায়তা করবে [ stackoverflow.com/questions/863838/… [1]: stackoverflow.com/questions/863838/…
মজডি প্রোগ্রামার বাইবয়

6
জেডিকে 9 এর ইউটিএফ -8 সমর্থন করা উচিত,
জেপি

উত্তর:


374

ResourceBundle#getBundle()কভার অধীনে ব্যবহারসমূহ PropertyResourceBundleএকটি যখন .propertiesফাইল উল্লেখ করা হয়। পরিবর্তে এই Properties#load(InputStream)বৈশিষ্ট্যগুলি ফাইল লোড করতে ডিফল্টরূপে এটি ব্যবহার করে । জাভাডোক হিসাবে , তারা ডিফল্টরূপে আইএসও -8859-1 হিসাবে পড়ে।

public void load(InputStream inStream) throws IOException

ইনপুট বাইট স্ট্রিম থেকে একটি সম্পত্তি তালিকা (কী এবং উপাদানগুলির জোড়া) পড়ে। ইনপুট স্ট্রিমটি লোড (রিডার) এ উল্লিখিত হিসাবে একটি সাধারণ লাইন-ভিত্তিক ফর্ম্যাটে রয়েছে এবং আইএসও 8859-1 অক্ষর এনকোডিং ব্যবহার করা হয় বলে ধরে নেওয়া হয় ; এটি প্রতিটি বাইট হ'ল একটি ল্যাটিন 1 অক্ষর। লাতিন 1-এ নয় এমন অক্ষর এবং কিছু বিশেষ অক্ষর, জাভা ™ ভাষা নির্দিষ্টকরণের ৩.৩ অনুচ্ছেদে বর্ণিত ইউনিকোড পলায়ন ব্যবহার করে কী এবং উপাদানগুলিতে উপস্থাপিত হয়।

সুতরাং, আপনার সেগুলি আইএসও -8859-1 হিসাবে সংরক্ষণ করতে হবে। আপনার যদি ISO-8859-1 সীমার বাইরে কোনও অক্ষর থাকে এবং আপনি \uXXXXমাথার উপরের অংশটি ব্যবহার করতে না পারেন এবং আপনাকে এইভাবে UTF-8 হিসাবে ফাইলটি সংরক্ষণ করতে বাধ্য করা হয়, তবে আপনাকে রূপান্তর করতে নেটিসি 2 এসসিআই সরঞ্জামটি ব্যবহার করতে হবে ইউটিএফ -8 সংরক্ষিত বৈশিষ্ট্য ফাইলটি একটি আইএসও -8859-1 সংরক্ষিত বৈশিষ্ট্য ফাইলে ফেলা হয়েছে যাতে সমস্ত অনাবৃত অক্ষরগুলিকে \uXXXXফর্ম্যাটে রূপান্তরিত করা হয়। নীচের উদাহরণটি কোনও ইউটিএফ -8 এনকোডযুক্ত বৈশিষ্ট্য ফাইলকে text_utf8.propertiesএকটি বৈধ আইএসও -8859-1 এনকোড করা বৈশিষ্ট্য ফাইলে রূপান্তর করে text.properties

নেটিটিয়াএসসিআই-এনকোডিং ইউটিএফ -8 পাঠ্য_টফ 8. প্রপার্টি পাঠ্য

Eclipse এর মতো কোনও বুদ্ধিমান IDE ব্যবহার করার সময়, আপনি যখন .propertiesজাভা ভিত্তিক প্রকল্পে একটি ফাইল তৈরি করেন এবং Eclipse এর নিজস্ব সম্পাদক ব্যবহার করেন তবে এটি ইতিমধ্যে স্বয়ংক্রিয়ভাবে সম্পন্ন হবে । গ্রহনটি স্বচ্ছভাবে ISO-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());

আরো দেখুন:


ধন্যবাদ। বিটিডাব্লু ফর্ম্যাট ফরমেটগুলিকে ফোরমাT_PROPERTIES ফেরত দেওয়ার জন্য ওভাররাইড করা ভাল ধারণা বলে মনে হচ্ছে।
ফ্লাভিও এরটস্কো

গেটফর্ম্যাটগুলি () ওভাররাইড করার জন্য আপনি কি এই পরামর্শটি বিশদভাবে বলতে পারেন?
মার্ক রোপার

1
@ imgx64: জানানোর জন্য আপনাকে ধন্যবাদ। উত্তর ঠিক করা হয়েছে।
বালুসসি

10
আপনি StandardCharsets.UTF_8যদি জাভা 7+ ব্যবহার করছেন তবে ব্যবহার করতে দ্বিধা করবেন না
নিকস

1
@ নায়ারগডস: আপনি যদি প্রোগ্রামটিমেটিকভাবে এটি পরিবর্তন করার কারণগুলি দেখেন (তবে আমি জীবনের জন্য একবারের জন্য কল্পনাও করতে পারি না), নির্দ্বিধায় এটি অনুভব করুন। আমি পোস্ট করা সমস্ত কোড স্নিপেটগুলি সর্বোপরি কেবল কিক অফের উদাহরণ।
বালুসসি

131

দেওয়া হয়েছে যে আপনার রিসোর্সবাণ্ডলের একটি উদাহরণ রয়েছে এবং আপনি স্ট্রিং দ্বারা পেতে পারেন:

String val = bundle.getString(key); 

আমি আমার জাপানি ডিসপ্লে সমস্যাটি এর দ্বারা সমাধান করেছি:

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

36
সমস্ত নিখুঁত upvoters / মন্তব্যকারীদের এখানে: এটি কোনও সমাধান নয়, বরং একটি কর্মচঞ্চল। প্রকৃত অন্তর্নিহিত সমস্যাটি এখনও দাঁড়িয়ে আছে এবং এর সমাধান প্রয়োজন।
বালুসসি

2
এটি আমার পরিস্থিতি স্থির করেছে। সমাধানটি হবে জাভা জন্য ইউটিএফ -8 স্থানীয়ভাবে রিসোর্স বান্ডলে এবং সম্পত্তি ফাইলগুলিতে পরিচালনা করা to যতক্ষণ না ঘটে আমি একদম ব্যবহার করব
জনআরডিওরজিও

@BalusC; এই পদ্ধতির অসুবিধা কী? (অতিরিক্ত স্ট্রিং তৈরি করা ছাড়া অন্য?)
প্যাসকে

8
@ পাসক: এটি কোনও সমাধান নয়, সমাধান নয়। কোড বেজ জুড়ে আপনাকে সমস্ত স্ট্রিং ভেরিয়েবলের সমস্ত জায়গার উপরে পুনরায় প্রয়োগ করতে হবে। এটি খাঁটি বাজে কথা। কেবলমাত্র এক জায়গায় এটি সঠিক জায়গায় ঠিক করুন যাতে স্ট্রিং ভেরিয়েবলগুলি অবিলম্বে সঠিক মানটি ধারণ করে। ক্লায়েন্টটি সংশোধন করার কোনও দরকার নেই।
BalusC

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);

বিটিডব্লিউ:। প্রপার্টি ফাইল থেকে স্ট্রিম পান :

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

বিটিডাব্লু: এর থেকে রিসোর্স বান্ডেল পান InputStreamReader:

ResourceBundle rb = new PropertyResourceBundle(isr);

আশা করি এটি আপনাকে সহায়তা করতে পারে!


3
যদিও আসল প্রশ্নটি এখানেই ResourceBundle
নাইয়ারগডস

1
সত্য, আপনি যদি ব্যবহার করছেন Propertiesএবং আপনি UTF-8স্ট্রিং পুনরুদ্ধার করতে চান তবে এটি একটি কবজির মতো কাজ করে this তবে ResourceBundleভাষা সংস্থার মতো কোনও ক্ষেত্রে তারপরে গ্রহণযোগ্য উত্তরটি মার্জিত। তবুও উত্তরটি ভোট দিয়েছে।
ইলজিট ইল্ডারিয়াম

ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
উপার্জন করুন

22

ResourceBundle.Control ইউটিএফ -8 এবং নতুন স্ট্রিং পদ্ধতিগুলির সাথে কাজ করে না, উদাহরণস্বরূপ, যদি বৈশিষ্ট্যগুলি ফাইল সিপি 1251 চরসেট ব্যবহার করে।

সুতরাং আমি একটি সাধারণ পদ্ধতি ব্যবহার করে পুনরায় সংযুক্ত হয়েছি: ইউনিকোড প্রতীকগুলিতে লিখুন । এর জন্য:

আইডিইএ - এর একটি বিশেষ " স্বচ্ছ নেটিভ টু এএসসিআইআই রূপান্তর " বিকল্প (সেটিংস> ফাইল এনকোডিং) রয়েছে।

Eclipse - এর একটি প্লাগইন রয়েছে " প্রোপার্টি এডিটর " । এটি পৃথক অ্যাপ্লিকেশন হিসাবে কাজ করতে পারে।


3
ইন্টেলিজ আইডিইএ 14 এ, সেটিংস -> সম্পাদক -> ফাইল এনকোডিংগুলিতে অবস্থিত। এই বিকল্পটি কার্যকর হওয়ার জন্য আমাকে যে কোনও বিদ্যমান সম্পত্তি ফাইলগুলি মুছতে হয়েছিল এবং সেগুলি পুনরায় তৈরি করতে হয়েছিল।
সাইফার

আইডিই এর উত্তরের সাথে বিশেষভাবে প্রাসঙ্গিক নয় তবে কেবলমাত্র এমন সরঞ্জাম যা ইউটিএফ -8 চরিত্র-সেটটিতে সামগ্রী সংরক্ষণ না করার অন্তর্নিহিত সমস্যাটিকে সত্যিই চিহ্নিত করে না .... যা রূপান্তর বা হ্যাকারি লেখার মতো বৈশিষ্ট্য ছাড়াই সমস্যাটি সরাসরি সমাধান করবে একটি ইউনিকোড প্রতীক একটি ফাইলের ভিতরে একটি পৃথক অক্ষর সেট সঙ্গে সংজ্ঞায়িত।
ড্যারেল টিগু

21

এই সমস্যাটি শেষ পর্যন্ত জাভা 9 এ স্থির করা হয়েছে: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9

বৈশিষ্ট্য ফাইলগুলির জন্য ডিফল্ট এনকোডিং এখন ইউটিএফ -8।

সর্বাধিক বিদ্যমান বৈশিষ্ট্যগুলির ফাইলগুলি প্রভাবিত করা উচিত নয়: ইউটিএফ -8 এবং আইএসও -8859-1 এএসসিআইআই অক্ষরগুলির জন্য একই এনকোডিং রয়েছে এবং মানব-পঠনযোগ্য নন-এএসসিআইআই আইএসও -8859-1 এনকোডিং বৈধ ইউটিএফ -8 নয়। যদি কোনও অবৈধ ইউটিএফ -8 বাইট ক্রম সনাক্ত হয়, জাভা রানটাইম স্বয়ংক্রিয়ভাবে আইএসও -8859-1-এ ফাইলটি পুনরায় পাঠ করবে।


19

আমরা এমন একটি রিসোর্স.ইউটিএফ 8 ফাইল তৈরি করি যা ইউটিএফ -8 এর সংস্থানগুলি ধারণ করে এবং নিম্নলিখিতটি চালনার নিয়ম আছে:

native2ascii -encoding utf8 resources.utf8 resources.properties

আমরা কোথা native2asciiথেকে পাই ? আমি সবেমাত্র করেছি find / -name native2ascii*এবং কোন ফল পাইনি, তাই আমি ধরে নিলাম এটি কেবল
জেডিকে-র

হুঁ। এটি আইবিএম জেডিকে-র অংশ নয়, তবে এটি ওরাকল জেডিকে-তে অন্তর্ভুক্ত বলে মনে হচ্ছে jdk1.*.0_*/bin
আর্টঅফ ওয়ারফেয়ার

এটা তোলে অন্তত JDK 6. মধ্যে আইবিএম JDK এর অংশ হিসাবে উপস্থিত করে,
এরিক ফিন

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

এটি খুব ভাল কাজ করে। সবেমাত্র ইউটিএফ 8 তে একটি চীনা অনুবাদ বৈশিষ্ট্য ফাইল যুক্ত করা হয়েছে এবং এটি কোনও সমস্যা ছাড়াই লোড হয়ে যায়।
tresf

9

মনোযোগ দিন: জাভা সম্পত্তি ফাইলগুলি আইএসও 8859-1 এ এনকোড করা উচিত!

আইএসও 8859-1 অক্ষর এনকোডিং। যে অক্ষরগুলি সরাসরি এই এনকোডিংটিতে প্রতিনিধিত্ব করা যায় না সেগুলি ইউনিকোড পলায়ন ব্যবহার করে লেখা যেতে পারে; কেবলমাত্র একটি একক 'u' অক্ষরকে পালানোর অনুক্রমে অনুমোদিত।

@ সি প্রপার্টি জাভা ডক

আপনি যদি এখনও সত্যিই এটি করতে চান: একবার দেখুন: Eclipseজাভা বৈশিষ্ট্য ইউটিএফ -8 এনকোডিং - কিছু কোডের নমুনা রয়েছে


1
জাভা! =গ্রহণ… ... পরেরটি একটি আইডিই। আরও ডেটা! = জাভা জাভা স্ট্রাক প্রসেসিংকে বিশাল আকারের অক্ষর সেটগুলি ব্যবহার করে সমর্থন করে, যা আন্তর্জাতিকীকরণের জন্য (প্রশ্ন সর্বোপরি রিসোর্সবাণ্ডল সম্পর্কে) ... সর্বাধিক সোজা-ফরোয়ার্ড উত্তর হিসাবে ইউটিএফ -8 ব্যবহার করার সমাধান করে। লক্ষ্য ভাষার দ্বারা সমর্থিত নয় এমন একটি অক্ষরে সেট করে সম্পত্তি ফাইলগুলি অকারণে সমস্যাটিকে জটিল করে তোলে।
ডারেল টিগু

@ ড্যারেল টিগু: রেজোসবান্ডলের জন্য লোড হওয়া একটি প্রাম্টি ফাইল হ'ল "ইঙ্গিত" হ'ল আইএসও 8859-1 হ'ল একটি জাভা বিবৃতি: ডকস.অরাকলস / জাভেস / / ডকস / এপি / জাভা / ইউটিল / … .. আমার উত্তরের দ্বিতীয় অংশটি হ'ল সমস্যাটি কীভাবে মোকাবেলা করতে হবে তার একটি "ইঙ্গিত"।
রাল্ফ

5

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

ইতিমধ্যে উল্লিখিত সম্পত্তি ফাইলগুলি আইএসও 8859-1 এ এনকোড করা উচিত

আপনার জন্য ইউনিকোড রূপান্তর করতে আপনি গ্রহন আইডিই জন্য উপরের প্লাগইনটি ব্যবহার করতে পারেন।


3

এখানে একটি জাভা 7 সমাধান রয়েছে যা পেয়ারা-র দুর্দান্ত সমর্থন লাইব্রেরি ব্যবহার করে এবং রিসোর্স কনস্ট্রাক্ট ব্যবহার করে। এটি সামগ্রিক অভিজ্ঞতার জন্য ইউটিএফ -8 ব্যবহার করে বৈশিষ্ট্যগুলির ফাইলগুলি পড়ে এবং লেখায়।

ইউটিএফ -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
  }
}

ইউটিএফ -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
}

এই উত্তর দরকারী। বিভিন্ন উত্তর সহ এখানে মূল সমস্যাটি ডেটা এবং চরিত্রের সেট সম্পর্কে একটি ভুল বোঝাবুঝি বলে মনে হচ্ছে। জাভা যে কোনও ডেটা পড়তে পারে (সঠিকভাবে) কেবল উপরে বর্ণিত অক্ষর সেটটি নির্দিষ্ট করে নির্দিষ্ট করে by ইউটিএফ -8 সাধারণত গ্রহের প্রতিটি ভাষা না হলে সবচেয়ে বেশি সমর্থন করতে ব্যবহৃত হয় এবং তাই রিসোর্সবাণ্ডল ভিত্তিক বৈশিষ্ট্যগুলিতে খুব বেশি প্রযোজ্য।
ড্যারেল টিগু

@ ড্যারেলটাইগ: ওয়েল, "ইউটিএফ -8 সাধারণত সমর্থন করতে ব্যবহৃত হয় ..." - এর পরিবর্তে " ইউনিকোড সাধারণত সমর্থন করতে ব্যবহৃত হয় ..." :) ইউটিএফ -8 ইউনিকোডের কেবলমাত্র একটি চরিত্রের এনকোডিং ( এন এন .wikedia.org / wiki / UTF-8 )।
হনজা জিদেক

প্রকৃতপক্ষে ইউটিএফ -8 বলতে "চরিত্র সেট" (কেবলমাত্র কোনও ইউনিকোড অক্ষর সেট উল্লেখ করা বনাম) হিসাবে ইউটিএফ -8 এ প্রসঙ্গে ইউটিএফ -8 হিসাবে উচ্চতর কিছু পদক্ষেপের দ্বারা ইন্টারনেটে প্রাধান্য পেয়েছে বলে বোঝানো হয়েছিল 67%। রেফ: স্ট্যাকওভারফ্লো.com
ড্যারেল টিগি

3

যেমনটি প্রস্তাবিত হয়েছিল, আমি রিসোর্স বান্ডিল বাস্তবায়নের মধ্য দিয়ে গিয়েছিলাম .. তবে তাতে কোনও লাভ হয়নি .. যেহেতু বান্ডেলটি সর্বদা en_US লোকেলের অধীনে ডাকা হত ... আমি আমার ডিফল্ট লোকেলটিকে অন্য একটি ভাষাতে সেট করার চেষ্টা করেছি এবং এখনও আমার সংস্থান বান্ডিল প্রয়োগ করেছি কন্ট্রোলটি এন_ ইউএস দিয়ে ডেকে আনা হয়েছিল ... আমি লগ বার্তা দেওয়ার চেষ্টা করেছি এবং ডিবাগের মাধ্যমে একটি পদক্ষেপ নেওয়ার চেষ্টা করেছি এবং এক্সএইচটিএমএল এবং জেএসএফ কলগুলির মাধ্যমে রানের সময় লোকাল পরিবর্তন করার পরে একটি অন্য স্থানীয় কল করা হচ্ছে কিনা তা ... যা খুশী হয়নি ... তারপরে আমি আমার সার্ভারের (টমক্যাট সার্ভার) ফাইলগুলি পড়ার জন্য একটি সিস্টেম সেটটি একটি ইউটিএফ 8 এ ডিফল্ট করার চেষ্টা করলাম .. তবে এটি আমার প্রথম শ্রেণীর লাইব্রেরিগুলি utf8 এর অধীনে সংকলিত হয়নি এবং টমক্যাটটি utf8 ফর্ম্যাটে পড়তে শুরু করেছে এবং সার্ভারটি ঠিকমতো চলছিল না ... তারপরে আমি আমার জাভা কন্ট্রোলারে একটি পদ্ধতি প্রয়োগ করে এক্সএইচটিএমএল ফাইল থেকে ডেকে আনতে পেরেছি ..এই পদ্ধতিতে আমি নিম্নলিখিতগুলি করেছি:

        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;
        }

আমি বিশেষত নার্ভাস হয়ে গিয়েছিলাম কারণ এটি আমার অ্যাপ্লিকেশনটির কার্যকারিতা কমিয়ে আনতে পারে ... তবে এটি প্রয়োগের পরে দেখে মনে হচ্ছে যেন এখন আমার অ্যাপ্লিকেশনটি দ্রুততর হয়েছে .. আমি মনে করি এটি কারণ, আমি এখন সুযোগ দেওয়ার পরিবর্তে সরাসরি সম্পত্তিগুলিতে অ্যাক্সেস করছি জেএসএফ বৈশিষ্ট্য অ্যাক্সেস করার উপায়টিকে বিশ্লেষণ করে ... আমি বিশেষভাবে এই কলটিতে বুলিয়ান যুক্তিটি পাস করি কারণ আমি জানি যে কয়েকটি বৈশিষ্ট্য অনুবাদ করা হবে না এবং utf8 ফর্ম্যাটে থাকার দরকার নেই ...

এখন আমি আমার প্রোপার্টি ফাইলটি ইউটিএফ 8 ফর্ম্যাটে সংরক্ষণ করেছি এবং আমার অ্যাপ্লিকেশনের প্রত্যেক ব্যবহারকারীর পৃথক স্থানীয় পছন্দ রয়েছে বলে এটি কাজ করছে।


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। এর আগে আমি এর আগে কখনও শুনিনি তবে আমি এটি কনসোলে টাইপ করেছি এবং দেখছি এটি একটি জিনিস যা বিদ্যমান (
সেন্টোস in এ

এখন যেহেতু আমি আসলে এটি ব্যবহার করার চেষ্টা করেছি, এটি কার্যকর হয়নি: এটি প্রথম চরিত্রটিতে ছুঁড়েছে যা আইএসও -৫৫৯-১ এ রূপান্তরিত হতে পারে না।
আর্টঅফ ওয়ারফেয়ার

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)

অথবা আপনি বিকল্প কন্সট্রাক্টর ব্যবহার করতে পারেন যা ইউটিএফ -8 ডিফল্টরূপে ব্যবহার করে:

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

0

সেটিংস / পছন্দসমূহ ডায়ালগ ( Ctrl+ Alt+ S) খুলুন , তারপরে সম্পাদক এবং ফাইল এনকোডিংগুলিতে ক্লিক করুন।

উইন্ডোর স্ক্রিনশট দেখানো হয়েছে

তারপরে, নীচে, আপনি বৈশিষ্ট্য ফাইলগুলির জন্য ডিফল্ট এনকোডিংগুলি ফিং করবেন। আপনার এনকোডিং টাইপ চয়ন করুন।

বিকল্পভাবে আপনি আপনার সংস্থান বান্ডেলে পাঠ্যের পরিবর্তে ইউনিকোড চিহ্ন ব্যবহার করতে পারেন (উদাহরণস্বরূপ "ів"সমান \u0456\u0432)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.