UTF-8 को स्ट्रिंग एनकोड करें


190

मेरे पास एक स्ट्रिंग है जिसमें "ñ" चरित्र है और मुझे इसके साथ कुछ समस्याएं हैं। मुझे इस स्ट्रिंग को UTF-8 एन्कोडिंग में एन्कोड करना होगा। मैंने इसे इस तरह से आजमाया है, लेकिन यह काम नहीं करता है:

byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");

मैं उस स्ट्रिंग को utf-8 में कैसे एन्कोड करूं?


2
यह स्पष्ट नहीं है कि वास्तव में आप क्या करने की कोशिश कर रहे हैं। क्या myString में सही ढंग से ñ वर्ण सम्‍मिलित है और आपको इसे बाइट सरणी में परिवर्तित करने में समस्‍या है (उस स्थिति में पीटर और आमिर के उत्तर देखें), या myString दूषित है और आप इसे ठीक करने का प्रयास कर रहे हैं (उस स्थिति में, जोआचिम के उत्तर देखें) और मैं)?
माइकल बोर्गवर्ड

मुझे अपने सर्वर को utf-8 एन्कोडिंग के साथ भेजने की आवश्यकता है और मुझे "ñ" चरित्र को utf-8 एन्कोडिंग में बदलने की आवश्यकता है।
एलेक्स

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

@ मिचेल: मैं मानता हूं कि यह स्पष्ट नहीं है कि असली मंशा यहां क्या है। ऐसे बहुत से प्रश्न प्रतीत होते हैं जहाँ लोग स्ट्रिंग्स और बाइट्स के बीच रूपांतरण को स्पष्ट करने की कोशिश कर रहे हैं बजाय {In,Out}putStream{Read,Writ}ersइसके कि वे इसे करने दें। मुझे आश्चर्य है क्योंकि?
tchrist

1
@ माइकल: धन्यवाद, मुझे लगता है कि समझ में आता है। लेकिन यह भी मुश्किल से यह होना चाहिए बनाता है, है ना? मैं उन भाषाओं का बहुत शौकीन नहीं हूं जो उस तरह से काम करती हैं, और इसलिए उनके साथ काम करने से बचने की कोशिश करें। मुझे लगता है कि बाइट्स के बजाय पात्रों के स्ट्रिंग्स के जावा का मॉडल चीजों को पूरी तरह से आसान बनाता है। पर्ल और पायथन भी "सब कुछ यूनिकोड स्ट्रिंग्स" मॉडल साझा करते हैं। हां, तीनों में आप अभी भी बाइट्स पर पहुंच सकते हैं यदि आप इस पर काम करते हैं, लेकिन व्यवहार में यह दुर्लभ लगता है कि आपको वास्तव में इसकी आवश्यकता है: यह काफी निम्न-स्तर है। इसके अलावा यह एक बिल्ली को गलत दिशा में ब्रश करने की तरह थोड़े लगता है, अगर आप जानते हैं कि मेरा क्या मतलब है। :)
tchrist

जवाबों:


140

String जावा में ऑब्जेक्ट UTF-16 एन्कोडिंग का उपयोग करते हैं जिन्हें संशोधित नहीं किया जा सकता है।

केवल एक चीज जो एक अलग एन्कोडिंग हो सकती है वह है ए byte[]। इसलिए यदि आपको UTF-8 डेटा की आवश्यकता है, तो आपको एक की आवश्यकता है byte[]। यदि आपके पास एक Stringअप्रत्याशित डेटा है, तो समस्या कुछ पुराने स्थान पर है जो गलत तरीके से कुछ बाइनरी डेटा को एक में परिवर्तित कर देता है String(यानी यह गलत एन्कोडिंग का उपयोग कर रहा था)।


92
तकनीकी रूप से, बाइट [] में कोई एन्कोडिंग नहीं है। बाइट सरणी प्लस एन्कोडिंग हालांकि आप स्ट्रिंग दे सकते हैं।
पीटर Petertibraný

1
@ अभिनेता: सच है। लेकिन इसके लिए एक एन्कोडिंग संलग्न करना केवल समझ में आता है byte[], इसका कोई मतलब नहीं है String(जब तक कि एन्कोडिंग UTF-16 है, इस मामले में यह समझ में आता है लेकिन यह अभी भी अनावश्यक जानकारी है)।
जोचिम सॉर

4
String objects in Java use the UTF-16 encoding that can't be modified. क्या आपके पास इस उद्धरण के लिए एक आधिकारिक स्रोत है?
अहमद हज्जार

@AhmadHajjar docs.oracle.com/javase/10/docs/api/java/lang/… : "जावा प्लेटफ़ॉर्म चार्ट और स्ट्रिंग और स्ट्रिंगर कक्षाओं में UTF-16 प्रतिनिधित्व का उपयोग करता है।"
मक्सी गिस

173

कैसे उपयोग के बारे में

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)

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

8
लेकिन मैं एक एन्कोडेड स्ट्रिंग कैसे प्राप्त करूं? यह एक बाइटबफ़र
एलेक्स

7
@ एलेक्स: यह यूटीएफ -8 एन्कोडेड जावा स्ट्रिंग का होना संभव नहीं है । आप बाइट्स चाहते हैं, इसलिए या तो सीधे बाइट बफ़र का उपयोग करें (यदि आपका लक्ष्य इसे नेटवर्क संग्रह के माध्यम से भेजना है तो भी सबसे अच्छा समाधान हो सकता है) या बाइट प्राप्त करने के लिए उस पर कॉल सरणी ()
माइकल बोर्गवर्ड

2
कुछ और जो मददगार हो सकता है, वह है स्ट्रिंग के बजाय अमरूद के चार्टसेट। स्ट्रिंग -> बाइट्स: myString.getBytes(Charsets.UTF_8)और बाइट्स -> स्ट्रिंग new String(myByteArray, Charsets.UTF_8):।
laughing_man

24
और भी बेहतर, उपयोग करें StandardCharsets.UTF_8। जावा 1.7+ में उपलब्ध है।
कैट

81

Java7 में आप उपयोग कर सकते हैं:

import static java.nio.charset.StandardCharsets.*;

byte[] ptext = myString.getBytes(ISO_8859_1); 
String value = new String(ptext, UTF_8); 

इसका यह फायदा है getBytes(String)कि यह घोषित नहीं करता है throws UnsupportedEncodingException

यदि आप एक पुराने जावा संस्करण का उपयोग कर रहे हैं तो आप खुद को चारसेट स्थिरांक घोषित कर सकते हैं:

import java.nio.charset.Charset;

public class StandardCharsets {
    public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
    public static final Charset UTF_8 = Charset.forName("UTF-8");
    //....
}

2
यह सही जवाब है। यदि कोई स्ट्रिंग डेटाटाइप का उपयोग करना चाहता है, तो वह इसे सही प्रारूप में उपयोग कर सकता है। बाकी के उत्तर बाइट स्वरूपित प्रकार की ओर इशारा कर रहे हैं।
नीरज शुक्ला

काम करता है 6. धन्यवाद।
इसका मुखीस

मेरे लिए भी सही उत्तर। एक बात हालांकि, जब मैं ऊपर के रूप में इस्तेमाल किया, जर्मन चरित्र बदल गया? तो, मैंने इसका इस्तेमाल किया: बाइट [] ptext = myString.getBytes (UTF_8); स्ट्रिंग मूल्य = नया स्ट्रिंग (ptext, UTF_8); यह ठीक काम किया।
फरहान हाफ़िज़

3
कोड नमूना समझ में नहीं आता है। यदि आप पहली बार ISO-8859-1 में कनवर्ट करते हैं, तो बाइट का वह क्रम UTF-8 नहीं है, इसलिए अगली पंक्ति पूरी तरह से गलत है। यह ASCII स्ट्रिंग्स के लिए काम करेगा, निश्चित रूप से, लेकिन फिर आप एक सरल प्रतिलिपि बना सकते हैं String value = new String(myString);:।
एलेक्सिस विल्के

76

के byte[] ptext = String.getBytes("UTF-8");बजाय का उपयोग करें getBytes()getBytes()तथाकथित "डिफ़ॉल्ट एन्कोडिंग" का उपयोग करता है, जो UTF-8 नहीं हो सकता है।


9
@ मिचेल: उन्हें स्पष्ट रूप से स्ट्रिंग से बाइट लेने में परेशानी हो रही है। GetBytes (एन्कोडिंग) बिंदु कैसे गायब है? मुझे लगता है कि दूसरी पंक्ति सिर्फ यह जांचने के लिए है कि क्या वह इसे वापस बदल सकती है।
पीटर Petertibraný

1
मैं इसे एक टूटी हुई स्ट्रिंग होने के रूप में व्याख्या करता हूं और बाइट्स और बैक (सामान्य गलतफहमी) में परिवर्तित करके इसे "ठीक" करने की कोशिश कर रहा हूं। कोई वास्तविक संकेत नहीं है कि दूसरी पंक्ति सिर्फ परिणाम की जांच कर रही है।
माइकल बोर्गवर्ड 12

@ माइकल, नहीं, वहाँ नहीं है, यह सिर्फ मेरी व्याख्या है। तुम्हारा बस अलग है।
पीटर 12tibraný

1
@ पेटर: आप सही कह रहे हैं, हमें एलेक्स से स्पष्टीकरण की आवश्यकता होगी कि उसका वास्तव में क्या मतलब है। जब तक जवाब संपादित नहीं किया जाता है तब तक डाउनवोट को रद्द नहीं किया जा सकता ...
माइकल बोर्गवर्ड

33

एक जावा स्ट्रिंग आंतरिक रूप से हमेशा UTF-16 में एन्कोड किया जाता है - लेकिन आपको वास्तव में इसके बारे में इस तरह सोचना चाहिए: एन्कोडिंग स्ट्रिंग्स और बाइट्स के बीच अनुवाद करने का एक तरीका है।

इसलिए यदि आपके पास एक एन्कोडिंग समस्या है, तब तक आपके पास स्ट्रिंग है, तो इसे ठीक करने के लिए बहुत देर हो चुकी है। आपको उस जगह को ठीक करने की आवश्यकता है जहां आप एक फ़ाइल, DB या नेटवर्क कनेक्शन से उस स्ट्रिंग को बनाते हैं।


1
यह मानना ​​एक सामान्य गलती है कि स्ट्रिंग्स को आंतरिक रूप से UTF-16 के रूप में एन्कोड किया गया है। आमतौर पर वे होते हैं, लेकिन अगर, यह स्ट्रिंग वर्ग का केवल एक कार्यान्वयन विशिष्ट विवरण है। चूंकि सार्वजनिक एपीआई के माध्यम से चरित्र डेटा का आंतरिक भंडारण सुलभ नहीं है, इसलिए एक विशिष्ट स्ट्रिंग कार्यान्वयन किसी अन्य एन्कोडिंग का उपयोग करने का निर्णय ले सकता है।
जर्न्ब्जो

4
@ जर्नबजो: एपीआई स्पष्ट रूप से बताता है "एक स्ट्रिंग UTF-16 प्रारूप में एक स्ट्रिंग का प्रतिनिधित्व करता है"। आंतरिक प्रारूप के रूप में किसी और चीज का उपयोग करना अत्यधिक अक्षम होगा, और मुझे पता है कि सभी वास्तविक कार्यान्वयन यूटीएफ -16 का आंतरिक रूप से उपयोग करते हैं। तो जब तक आप एक का हवाला नहीं दे सकते, तब तक आप बहुत बेतुके बालों में उलझते हैं।
माइकल बोर्गवर्ड

क्या सार्वजनिक पहुंच और डेटा संरचनाओं के आंतरिक प्रतिनिधित्व के बीच अंतर करना बेतुका है?
जर्बजो

6
JVM (जहाँ तक यह वीएम के लिए प्रासंगिक है) स्ट्रिंग फाइलिंग के लिए UTF-8 का उपयोग करता है, जैसे कि क्लास फाइल्स में। Java.lang.String के कार्यान्वयन को JVM से डिकूप किया जाता है और मैं आंतरिक प्रतिनिधित्व के लिए किसी अन्य एन्कोडिंग का उपयोग करके आपके लिए आसानी से कक्षा को लागू कर सकता हूं यदि आपके लिए यह वास्तव में आवश्यक है कि आपको यह पता चले कि आपका उत्तर गलत है। आंतरिक प्रारूप के रूप में UTF-16 का उपयोग करना ज्यादातर मामलों में अत्यधिक अक्षम होने के साथ-साथ स्मृति की खपत की बात आती है और मुझे नहीं लगता कि एम्बेडेड हार्डवेयर के लिए जावा कार्यान्वयन प्रदर्शन के बजाय मेमोरी के लिए ऑप्टिमाइज़ क्यों नहीं करेगा।
जर्बंजो

1
@ जर्नबजो: और एक बार और: जब तक आप एक जेवीएम का एक ठोस उदाहरण नहीं दे सकते, जिसका मानक एपीआई कार्यान्वयन आंतरिक रूप से स्ट्रिंग्स को लागू करने के लिए यूटीएफ -16 के अलावा किसी अन्य चीज का उपयोग करता है , मेरा कथन सही है। और नहीं, इंटर्न () और निरंतर पूल जैसी चीजों के कारण स्ट्रिंग वर्ग को वास्तव में जेवीएम से अलग नहीं किया गया है।
माइकल बोर्गवर्ड

22

आप इस तरह से कोशिश कर सकते हैं।

byte ptext[] = myString.getBytes("ISO-8859-1"); 
String value = new String(ptext, "UTF-8"); 

1
मैं पागल हो रहा था। "आईएसओ-8859-1" में बाइट्स प्राप्त करने के लिए धन्यवाद सबसे पहले समाधान था।
गियान गोमेन

2
ये गलत है। यदि आपके स्ट्रिंग में यूनिकोड वर्ण शामिल हैं, तो इसे 8859-1 में परिवर्तित करना एक अपवाद या बदतर फेंकने वाला है जो आपको एक अमान्य स्ट्रिंग देता है (शायद कोड बिंदु 0x100 और अधिक के साथ उन वर्णों के बिना स्ट्रिंग)।
एलेक्सिस विल्के

12

एक पल में मैं इस समस्या से गुज़रा और निम्नलिखित तरीके से इसे हल करने में कामयाब रहा

पहले मुझे आयात करने की आवश्यकता है

import java.nio.charset.Charset;

तब मुझे उपयोग करने के लिए एक निरंतर घोषित करना पड़ा UTF-8औरISO-8859-1

private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final Charset ISO = Charset.forName("ISO-8859-1");

तब मैं इसे निम्नलिखित तरीके से उपयोग कर सकता था:

String textwithaccent="Thís ís a text with accent";
String textwithletter="Ñandú";

text1 = new String(textwithaccent.getBytes(ISO), UTF_8);
text2 = new String(textwithletter.getBytes(ISO),UTF_8);

1
सही समाधान।
टुंडे पीज़ल

9
String value = new String(myString.getBytes("UTF-8"));

और, यदि आप "ISO-8859-1" एन्कोडेड टेक्स्ट फाइल से पढ़ना चाहते हैं:

String line;
String f = "C:\\MyPath\\MyFile.txt";
try {
    BufferedReader br = Files.newBufferedReader(Paths.get(f), Charset.forName("ISO-8859-1"));
    while ((line = br.readLine()) != null) {
        System.out.println(new String(line.getBytes("UTF-8")));
    }
} catch (IOException ex) {
    //...
}

2

मैं विशेष कोड को सांकेतिक शब्दों में बदलना करने के लिए कूट के नीचे कोड का उपयोग करता हूं।

String text = "This is an example é";
byte[] byteText = text.getBytes(Charset.forName("UTF-8"));
//To get original string from byte.
String originalString= new String(byteText , "UTF-8");

2

एक त्वरित कदम-दर-चरण गाइड कैसे नेटबीन्स डिफ़ॉल्ट एन्कोडिंग UTF-8 को कॉन्फ़िगर किया जाए। परिणाम में नेटबीन्स UTF-8 एन्कोडिंग में सभी नई फाइलें बनाएंगे।

नेटबीन्स डिफ़ॉल्ट एन्कोडिंग UTF-8 चरण-दर-चरण मार्गदर्शिका

  • नेटबीन्स इंस्टॉलेशन डायरेक्टरी में आदि फोल्डर में जाएं

  • Netbeans.conf फ़ाइल संपादित करें

  • Netbeans_default_options लाइन ढूंढें

  • Add -J-Dfile.encoding = UTF-8 उस पंक्ति के अंदर उद्धरण चिह्नों के अंदर

    (उदाहरण: netbeans_default_options="-J-Dfile.encoding=UTF-8")

  • नेटबीन्स को पुनरारंभ करें

आप नेटबीन्स डिफ़ॉल्ट एन्कोडिंग UTF-8 सेट करें।

आपके netbeans_default_options में उद्धरण चिह्नों के अंदर अतिरिक्त पैरामीटर हो सकते हैं। ऐसे मामले में, स्ट्रिंग के अंत में -J-Dfile.encoding = UTF-8 जोड़ें। इसे अन्य मापदंडों से अंतरिक्ष के साथ अलग करें।

उदाहरण:

netbeans_default_options = "- J-client -J-Xss128m -J-Xms256m -J-XX: PermSize = 32m -J-Dapple.laf.useScreenMusuBar = true -J-Dapple.awt.graphics.UseQuartz =J- True -J- D- D-। "

यहाँ आगे के विवरण के लिए लिंक है


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