UTF-8 बाइट [] स्ट्रिंग के लिए


243

मान लीजिए कि मैंने अभी-अभी BufferedInputStreamयूटीएफ -8 एनकोडेड टेक्स्ट फाइल के बाइट को बाइट ऐरे में पढ़ने के लिए इस्तेमाल किया है । मुझे पता है कि मैं बाइट्स को स्ट्रिंग में बदलने के लिए निम्नलिखित दिनचर्या का उपयोग कर सकता हूं, लेकिन क्या बाइट्स के माध्यम से पुनरावृत्ति करने और प्रत्येक को परिवर्तित करने की तुलना में ऐसा करने का एक अधिक कुशल / चालाक तरीका है?

public String openFileToString(byte[] _bytes)
{
    String file_string = "";

    for(int i = 0; i < _bytes.length; i++)
    {
        file_string += (char)_bytes[i];
    }

    return file_string;    
}

17
आप ऐसा क्यों नहीं कर सकते String fileString = new String(_bytes,"UTF-8");?
कूलबिंस

1
वैकल्पिक रूप से, आप एक बर्ड सरणी में पढ़ने के लिए BufferedReader का उपयोग कर सकते हैं।
एंडी थॉमस


@CoolBeans अगर मैं ऐसा करने के लिए जाना जाता था;) धन्यवाद।
22

फ़ाइल आकार के आधार पर, मुझे यकीन नहीं है कि पूरी byte[]मेमोरी को लोड करना और इसे new String(_bytes,"UTF-8")(या यहां तक +=कि स्ट्रिंग पर विखंडू द्वारा ) परिवर्तित करना सबसे कुशल है। विशेष रूप से बड़ी फ़ाइलों पर, श्रृंखलन इनपुटस्ट्रीम और पाठक बेहतर काम कर सकते हैं।
ब्रूनो

जवाबों:


498

स्ट्रिंगर के लिए कंस्ट्रक्टर को देखें

String str = new String(bytes, StandardCharsets.UTF_8);

और यदि आप आलसी महसूस कर रहे हैं, तो आप सीधे सीधे स्ट्रिंग को इनपुटस्ट्रीम में परिवर्तित करने के लिए अपाचे कॉमन्स आईओ लाइब्रेरी का उपयोग कर सकते हैं :

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);

13
या अमरुद की चार्जशीट .UTF_8 यदि आप JDK पर 1.7 से अधिक उम्र के हैं
siledh

6
यदि आप 19 से नीचे Android API पर हैं तो अमरूद के चार्ट्स.UTF_8 का उपयोग करें
बेन क्लेटन

और अगर चेकस्टाइल कहता है: "अवैध झटपट: java.lang.String की तात्कालिकता से बचा जाना चाहिए।", तो क्या?
अत्तिला नेपरास्की

1
आप यहाँ देख सकते हैं कि java.nio.charset.Charset.availableCharsets()सभी चार्ट केवल चार्ट में नहीं हैं StandardCharsets। और अगर आप कुछ अन्य चारसेट का उपयोग करना चाहते हैं और फिर भी स्ट्रिंग कंस्ट्रक्टर को फेंकने से रोकना चाहते हैं UnsupportedEncodingExceptionतो आप उपयोग कर सकते हैंjava.nio.charset.Charset.forName()
nyxz

2
IOUtils.toString (inputStream, StandardCharsets.UTF_8) को अब हटा दिया गया है।
आंग मयात हेन

41

जावा स्ट्रिंग श्रेणी में बाइट सरणी को स्ट्रिंग में परिवर्तित करने के लिए एक अंतर्निहित इन-कंस्ट्रक्टर है।

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46};

String value = new String(byteArray, "UTF-8");

9

Utf-8 डेटा परिवर्तित करने के लिए, आप बाइट्स और वर्णों के बीच 1-1 पत्राचार नहीं कर सकते हैं। इसे इस्तेमाल करे:

String file_string = new String(bytes, "UTF-8");

(बाह। मैं देख रहा हूं कि पोस्ट योर आंसर बटन को हिट करने में मैं धीमा हूं।)

स्ट्रिंग के रूप में संपूर्ण फ़ाइल पढ़ने के लिए, कुछ इस तरह करें:

public String openFileToString(String fileName) throws IOException
{
    InputStream is = new BufferedInputStream(new FileInputStream(fileName));

    try {
        InputStreamReader rdr = new InputStreamReader(is, "UTF-8");
        StringBuilder contents = new StringBuilder();
        char[] buff = new char[4096];
        int len = rdr.read(buff);
        while (len >= 0) {
            contents.append(buff, 0, len);
        }
        return buff.toString();
    } finally {
        try {
            is.close();
        } catch (Exception e) {
            // log error in closing the file
        }
    }
}

4

आप उसके लिए String(byte[] bytes) कंस्ट्रक्टर का उपयोग कर सकते हैं । विवरण के लिए इस लिंक को देखें। संपादित करें आपको जावा प्लेट के अनुसार अपने प्लेटफॉर्म के डिफ़ॉल्ट चारसेट पर भी विचार करना होगा:

प्लेटफ़ॉर्म के डिफ़ॉल्ट चारसेट का उपयोग करके बाइट्स के निर्दिष्ट सरणी को डिकोड करके एक नया स्ट्रिंग का निर्माण करता है। नई स्ट्रिंग की लंबाई चारसेट की एक फ़ंक्शन है, और इसलिए बाइट सरणी की लंबाई के बराबर नहीं हो सकती है। जब डिफ़ॉल्ट बाइट में दिए गए बाइट्स वैध नहीं हैं तो इस कंस्ट्रक्टर का व्यवहार अनिर्दिष्ट है। जब डीकोडिंग प्रक्रिया पर अधिक नियंत्रण की आवश्यकता होती है तो चारसेटडेकोडर वर्ग का उपयोग किया जाना चाहिए।


1
और यदि आपकी बाइट्स प्लेटफ़ॉर्म के डिफ़ॉल्ट चारसेट में नहीं हैं, तो आप उस संस्करण का उपयोग कर सकते हैं Charsetजिसमें रूपांतरण सही है यह सुनिश्चित करने के लिए दूसरा तर्क है।
माइक डेनियल

1
@ माइकडायनेल दरअसल, मैं सभी विवरणों को शामिल नहीं करना चाहता था। बस मेरे जवाब को संपादित किया
GETah

2

आप इस प्रश्न में वर्णित विधियों का उपयोग कर सकते हैं (विशेषकर जब आप एक इनपुटस्ट्रीम से शुरू करते हैं): स्ट्रिंग के लिए एक इनपुटस्ट्रीम पढ़ें / परिवर्तित करें

विशेष रूप से, यदि आप बाहरी पुस्तकालयों पर भरोसा नहीं करना चाहते हैं, तो आप इस उत्तर की कोशिश कर सकते हैं , जो कि एक बफर के InputStreamमाध्यम से पढ़ता है और इसे एक में जोड़ता है ।InputStreamReaderchar[]StringBuilder


2

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

public String openFileToString(String fileName) {
    String file_string;
    try {
        file_string = new String(_bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // this should never happen because "UTF-8" is hard-coded.
        throw new IllegalStateException(e);
    }
    return file_string;
}

2

यहां एक सरलीकृत फ़ंक्शन है जो बाइट्स में पढ़ा जाएगा और एक स्ट्रिंग बना देगा। यह मान लेता है कि शायद आपको पहले से ही पता है कि फ़ाइल को किस एन्कोडिंग में है (और अन्यथा चूक)।

static final int BUFF_SIZE = 2048;
static final String DEFAULT_ENCODING = "utf-8";

public static String readFileToString(String filePath, String encoding) throws IOException {

    if (encoding == null || encoding.length() == 0)
        encoding = DEFAULT_ENCODING;

    StringBuffer content = new StringBuffer();

    FileInputStream fis = new FileInputStream(new File(filePath));
    byte[] buffer = new byte[BUFF_SIZE];

    int bytesRead = 0;
    while ((bytesRead = fis.read(buffer)) != -1)
        content.append(new String(buffer, 0, bytesRead, encoding));

    fis.close();        
    return content.toString();
}

ओपी के प्रश्न का मिलान करने के लिए डिफ़ॉल्ट को utf-8 बनाने के लिए संपादित कोड।
स्कॉट

1

स्ट्रिंग में एक कंस्ट्रक्टर है जो बाइट लेता है [] और charsetname पैरामीटर के रूप में :)


0

इसमें पुनरावृत्ति भी शामिल है, लेकिन यह स्ट्रिंग को सुगम बनाने से बहुत बेहतर है क्योंकि वे बहुत महंगे हैं।

public String openFileToString(String fileName)
{
    StringBuilder s = new StringBuilder(_bytes.length);

    for(int i = 0; i < _bytes.length; i++)
    {
        s.append((char)_bytes[i]);
    }

    return s.toString();    
}

8
मेरे प्रिय स्वामी! String str = new String(byte[])बस ठीक कर देंगे।
21

3
यह दक्षता में सुधार करता है, लेकिन यह utf8 डेटा को ठीक से डिकोड नहीं करता है।
टेड हॉप

0

क्यों नहीं तुम क्या पाने के लिए देख रहे हो और बाइट्स की एक सरणी के बजाय फ़ाइल से एक स्ट्रिंग पढ़ें? कुछ इस तरह:

BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream( "foo.txt"), Charset.forName( "UTF-8"));

तब तक readLine जब तक यह किया जाता है।


कभी-कभी, मूल रेखा के सीमांकक को रखना उपयोगी होता है। ओपी ऐसा चाह सकता है।
ब्रूनो

0

मैं इस तरह का उपयोग करता हूं

String strIn = new String(_bytes, 0, numBytes);


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