ইউটিএফ -8 হিসাবে ইনপুট স্ট্রিম পড়া


97

আমি text/plainইন্টারনেটে লাইন-লাইন একটি ফাইল থেকে পড়ার চেষ্টা করছি । আমার এখনই কোডটি হ'ল:

URL url = new URL("http://kuehldesign.net/test.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
LinkedList<String> lines = new LinkedList();
String readLine;

while ((readLine = in.readLine()) != null) {
    lines.add(readLine);
}

for (String line : lines) {
    out.println("> " + line);
}

ফাইলটি, test.txtরয়েছে ¡Hélló!, যা আমি এনকোডিং পরীক্ষার জন্য ব্যবহার করছি।

আমি যখন OutputStream( out) পর্যালোচনা করি তখন আমি এটিকে দেখতে পাই > ¬°H√©ll√≥!। আমি বিশ্বাস করি না OutputStreamযেহেতু আমি out.println("é");সমস্যা ছাড়াই এটি করতে পারি তাই এটি একটি সমস্যা।

InputStreamইউটিএফ -8 হিসাবে পড়ার জন্য কোনও ধারণা ? ধন্যবাদ!


4
এইচটিটিপি প্রোটোকল এনকোডিং নির্দিষ্ট করে। আপনি কেন এমন লাইব্রেরি এপিআই ব্যবহার করছেন না যা আপনার পক্ষে এটি পরিচালনা করে? আপনার কখনই এ জাতীয় এনকোডিং অনুমান করা উচিত নয়। আমি নেতিবাচক হতে চাই না: আপনি দুর্দান্ত করছেন! আমি আরও আশ্চর্য হয়েছি যে এর চেয়ে সহজ উপায় নেই কিনা।
tchrist

4
text/plainদুর্ভাগ্যক্রমে ফাইলটি পরিবেশন করা সার্ভারটিতে আমার অ্যাক্সেস থাকবে না এবং এটি কোনও ইউটিএফ -8 এনকোডিং ব্যবহার করছে না। আমি কোনও ভাল নেটওয়ার্ক লাইব্রেরি সম্পর্কে অবগত ছিলাম না; কোনও পরামর্শ?
ক্রিস কুয়েল

4
দস্তাবেজগুলির দিকে তাকিয়ে , আমি মনে করি না যে আপনাকে কোনওভাবেই এনকোডিং নির্দিষ্ট করতে হবে। আমি অবাক হয়েছি তারা আপনাকে একটি বাইট স্ট্রিম দেয়! আপনার অন্তর্নিহিত ইউআরএল সংযোগে অ্যাক্সেস রয়েছে , যা থেকে আপনি বিষয়বস্তু-এনকোডিং পরীক্ষা করতে পারেন, তারপরে সঠিক যুক্তির সাহায্যে একটি ইনপুট স্ট্রিমরিডার খুলুন। উত্সের একটি দ্রুত চেক আপনার পক্ষে এমনটি মনে হয় যা এমন কিছু করে না যা দেখে মনে হয়, যা বেশ লম্বা লম্বা এবং ত্রুটির প্রবণ বলে মনে হচ্ছে, তাই আমি সম্ভবত কিছু মিস করেছি।
tchrist

উত্তর:


192

আমার নিজের সমস্যা সমাধান করেছেন। এই লাইন:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

করা প্রয়োজন:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

বা জাভা 7:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));

4
আমি নিশ্চিত যে কনস্ট্রাক্টরের ফর্মটি অবৈধ ইনপুটটিতে কোনও ব্যতিক্রম বাড়াবে না। আপনার একটি CharsetDecoder decযুক্তি সহ ব্যবহার করা দরকার । এটি একই জাভা ডিজাইনের বাগ যা OutputStreamWriterনির্মাণকারীদের রয়েছে: যখন কোনওটি ভুল হয়ে যায় তখন আপনাকে বলতে কেবল চারটির মধ্যে একজনই সম্মতি জানায়। আপনাকে আবার CharsetDecoder decসেখানে অভিনব তর্কও ব্যবহার করতে হবে। কেবলমাত্র নিরাপদ এবং বুদ্ধিমান কাজটি হ'ল অন্যান্য নির্মাণকারীকে অবনমিত বলে বিবেচনা করা, কারণ তাদের আচরণে বিশ্বাস করা যায় না।
tchrist

7
জাভা 7 যেহেতু স্ট্রিং হিসাবে নয় কনস্ট্যান্ট হিসাবে StandardCharsets.UTF_8
চরসেট সরবরাহ করা সম্ভব

18
String file = "";

try {

    InputStream is = new FileInputStream(filename);
    String UTF8 = "utf8";
    int BUFFER_SIZE = 8192;

    BufferedReader br = new BufferedReader(new InputStreamReader(is,
            UTF8), BUFFER_SIZE);
    String str;
    while ((str = br.readLine()) != null) {
        file += str;
    }
} catch (Exception e) {

}

এটা চেষ্টা কর,.. :-)


8
ফাইল + = str এর পরিবর্তে একটি স্ট্রিংবিল্ডার তৈরি করুন এবং এতে যুক্ত হন।
সংকলকটি

4
আপনি যদি বাফারআডারকে স্ট্রিংয়ে রূপান্তর করতে চান তবে অ্যাপাচি কমন্স ব্যবহার করুন, চাকাটি পুনরায় উদ্ভাবন করবেন না: স্ট্রিং মাইএসটিআর = org.apache.commons.io.IOUtils.toString (myBufferedReaderInstance);
জেইমি Marín,

8
UTF8 = "utf8", চমৎকার পরিবর্তনশীল;)
নিকফিসি

8

আমি যখনই কোনও বিশেষ চরিত্রকে এটি হিসাবে চিহ্নিত করে ততবার একই সমস্যার মুখোমুখি হয়েছি এটি সমাধানের জন্য, আমি এনকোডিংটি ব্যবহার করার চেষ্টা করেছি: আইএসও -8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}

আমি আশা করি এটি যে কেউ এই পোস্টটি দেখে তাদের সহায়তা করতে পারে।


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