ইউটিএফ -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
বিকল্পভাবে, আপনি একটি চরের অ্যারে পড়তে বাফারড্রেডার ব্যবহার করতে পারেন।
অ্যান্ডি টমাস


@ কুলবিয়ানস আমি এটি করতে পারত যদি আমি জানতাম;) আপনাকে ধন্যবাদ
skeryl

ফাইলের আকারের উপর নির্ভর করে, আমি নিশ্চিত নই যে পুরো byte[]স্মৃতিতে লোড করা এবং এটির মাধ্যমে রূপান্তর করা new String(_bytes,"UTF-8")(অথবা +=স্ট্রিংয়ের সাথে অংশগুলি দ্বারা ) সবচেয়ে কার্যকর। ইনপুটস্ট্রিম এবং পাঠকদের শৃঙ্খলাবদ্ধতা বিশেষত বড় ফাইলগুলিতে আরও ভাল কাজ করতে পারে।
ব্রুনো

উত্তর:


498

নির্মাণকারী তাকান স্ট্রিং

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

এবং যদি আপনি অলস বোধ করেন তবে আপনি ইনপুটস্ট্রিমটিকে সরাসরি একটি স্ট্রিতে রূপান্তর করতে অ্যাপাচি কমন্স আইও লাইব্রেরি ব্যবহার করতে পারেন :

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

13
বা পেয়ারার চরসেটস.আউটএফ_8 আপনি যদি জেডিকে ১. than এর চেয়ে বেশি বয়সী হন
1313

6
যদি আপনি 19 এরও কম অ্যান্ড্রয়েড এপিআই তে থাকেন তবে পেয়ারার চরসেটগুলি ব্যবহার করুন UTআউটএফ_ 8
বেন ক্লেটন

এবং যদি চেকস্টাইল বলে: "অবৈধ ইনস্ট্যান্টেশন: জাভা.লাং এর ইনস্ট্যান্টেশন। স্ট্রিং এড়ানো উচিত" ", তাহলে কী?
আটটিলা নেপারাকস্কি

1
আপনি এখানে java.nio.charset.Charset.availableCharsets()মানচিত্রটি দেখতে পাচ্ছেন কেবল চারসেটগুলি নয় StandardCharsets। এবং আপনি যদি অন্য কিছু UnsupportedEncodingExceptionjava.nio.charset.Charset.forName()
চরসেট

2
আইউইটিস.ল্ট স্ট্রিং (ইনপুটস্ট্রিম, স্ট্যান্ডার্ডচ্যারসেটস আউটফ 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
@ মাইকডানিয়েলস, আমি সমস্ত বিবরণ অন্তর্ভুক্ত করতে চাইনি।
সবেমাত্র

2

আপনি এই প্রশ্নে বর্ণিত পদ্ধতিগুলি ব্যবহার করতে পারেন (বিশেষত যেহেতু আপনি একটি ইনপুট স্ট্রিম দিয়ে শুরু করেছেন): ইনপুট স্ট্রিমটি একটি স্ট্রিংয়ে পড়ুন / রূপান্তর করুন

বিশেষত, আপনি যদি বাহ্যিক গ্রন্থাগারগুলির উপর নির্ভর করতে না চান তবে আপনি এই উত্তরটি চেষ্টা করতে পারেন , যা একটি বাফারের InputStreamমাধ্যমে একটিটি পড়ে এবং এটিতে যুক্ত করে ।InputStreamReaderchar[]StringBuilder


2

আপনি কোনও ইউটিএফ -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

স্ট্রিংয়ের এমন একটি কনস্ট্রাক্টর রয়েছে যা বাইট [] এবং প্যারামিটার হিসাবে অক্ষরনাম গ্রহণ করে :)


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[])ঠিক আছে।
zengr

3
এটি দক্ষতা উন্নত করে, তবে এটি utf8 ডেটা সঠিকভাবে ডিকোড করে না।
টেড হপ

0

আপনি যা যা করতে যাচ্ছেন তা কী থেকে পাবেন না এবং বাইটের অ্যারের পরিবর্তে ফাইল থেকে একটি স্ট্রিং পড়ছেন? কিছুটা এইরকম:

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

তারপরে এটি শেষ না হওয়া পর্যন্ত লাইনটি পড়ুন।


কখনও কখনও, এটি মূল লাইন প্রেরকগুলি রাখা দরকারী to ওপি এটি চাইবে।
ব্রুনো

0

আমি এইভাবে ব্যবহার করি

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


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