জাভাতে "ইউটিএফ -8" স্ট্রিং আক্ষরিক পেতে কোথায়?


489

আমি এই কোডের এই টুকরোটিতে স্ট্রিং আক্ষরিক পরিবর্তে একটি ধ্রুবক ব্যবহার করার চেষ্টা করছি:

new InputStreamReader(new FileInputStream(file), "UTF-8")

"UTF-8"কোডের পরিবর্তে প্রায়শই উপস্থিত হয় এবং static finalপরিবর্তে কিছু ভেরিয়েবল উল্লেখ করা আরও ভাল । আপনি কি জানেন যে আমি জেডিকে তেমন একটি পরিবর্তনশীল কোথায় পাই?

বিটিডাব্লু, দ্বিতীয় চিন্তা অনুসারে, এই ধরণের ধ্রুবকগুলি খারাপ ডিজাইন: পাবলিক স্ট্যাটিক লিটারালস ... ডেটা ডুপ্লিকেশনের জন্য কোনও সমাধান নয়?



1
দ্রষ্টব্য: আপনি যদি ইতিমধ্যে জাভা 7 এ থাকেন তবে Files.newBufferedWriter(Path path, Charset cs)এনআইও থেকে ব্যবহার করুন ।
ফ্র্যাংকলিন ইউ

উত্তর:


834

জাভা 1.7+ এ, java.nio.charset.SandardCharsetsCharset অন্তর্ভুক্ত করার জন্য ধ্রুবককে সংজ্ঞায়িত করে UTF_8

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

অ্যান্ড্রয়েডের জন্য: minSdk 19


3
আপনি কি .to স্ট্রিং () ব্যবহার করেন?
ম্যাট ব্রোখুইস

54
.toString()কাজ করবে তবে সঠিক ফাংশনটি হবে .name()। 99.9% টু স্ট্রিং এর উত্তর নয়।
রজার

1
বিটিডব্লিউও .displayName()কাজ করবে যদি না এটি যেমন স্থানীয়করণের জন্য উদ্দেশ্য হিসাবে ওভাররাইড করা হয়।
রজার

36
আপনার আসলেই কল name()করার দরকার নেই । আপনি Charsetঅবজেক্টটি সরাসরি InputStreamReaderকনস্ট্রাক্টরে পাস করতে পারেন ।
নাটিক্স

6
এবং সেখানে অন্যান্য libs আছে যা প্রয়োজন হয় Stringসম্ভবত উত্তরাধিকারগত কারণে। এই ধরনের ক্ষেত্রে, আমি Charsetসাধারণত কোনও উত্স থেকে নেওয়া StandardCharsetsএবং name()কোনও প্রয়োজনের জন্য ব্যবহার করি।
ম্যাগনাইলেক্স

134

এখন আমি কমন্স-ল্যাংorg.apache.commons.lang3.CharEncoding.UTF_8 থেকে ধ্রুবক ব্যবহার করি ।


4
ল্যাঙ 3.0 ব্যবহার করে তাদের জন্য: org.apache.commons.lang3.CharEncoding.UTF_8। (দ্রষ্টব্য "lang3")।
রাসেল সিলভা

24
আপনি যদি জাভা ১. using ব্যবহার করছেন তবে এটি স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসাবে নীচে @ রজারের উত্তরটি দেখুন।
ড্র স্টিফেনস

2
পিএস "@ রজারের উত্তর নীচে" এখন উপরে @ রজারের উত্তর । ☝
গ্যারি এস

জাভা 7 java.nio.charset.SandardCharsets পরিচয় করিয়ে
দেওয়ার পরে

66

গুগল পেয়ারা গ্রন্থাগার (যা আমি অত্যন্ত যাহাই হউক না কেন বলতে চাই, যদি আপনি জাভা কাজ করছেন) একটি হয়েছে Charsetsমত স্ট্যাটিক ক্ষেত্রের সাথে বর্গ Charsets.UTF_8, Charsets.UTF_16ইত্যাদি

জাভা 7 যেহেতু আপনার java.nio.charset.StandardCharsetsতুলনীয় ধ্রুবকগুলির পরিবর্তে কেবল ব্যবহার করা উচিত ।

মনে রাখবেন যে এই ধ্রুবকগুলি স্ট্রিং নয়, তারা প্রকৃত Charsetউদাহরণ। চারসেটের নাম নেওয়া সমস্ত স্ট্যান্ডার্ড এপিআইগুলিতে একটি ওভারলোড Charsetথাকে যা আপনার পরিবর্তে ব্যবহার করা উচিত a


3
সুতরাং, চরসেটগুলি হওয়া উচিত? আউটএফ_8.নাম ()?
অ্যালিকেলিন-কিলাকা

1
@ কিলাকা হ্যাঁ getDisplayName () এর পরিবর্তে নাম () ব্যবহার করুন যেহেতু নাম () চূড়ান্ত এবং getDisplayName () নয়
আরকুমেশ্বর

3
@ বুফালো: দয়া করে আমার উত্তরটি আবার পড়ুন: এটি ব্যবহারের পরামর্শ দেয় java.nio.charset.StandardCharsets সম্ভব হলে যা কোন তৃতীয় পক্ষের কোড নয়। অধিকন্তু, পেয়ারা চার্সেট সংজ্ঞাগুলি "ক্রমাগত সংশোধিত" হয় না এবং এএফআইএকি কখনও পিছনে সামঞ্জস্যতা ভঙ্গ করে না, তাই আমি মনে করি না যে আপনার সমালোচনা সুস্পষ্ট।
ড্যানিয়েল প্রাইডেন

2
@ বুফালো: এটি যেমনটি হতে পারে তবে আমি সন্দেহ করি যে আপনার ইস্যুগুলির Charsetsশ্রেণীর সাথে কোনও সম্পর্ক ছিল । আপনি যদি পেয়ারা সম্পর্কে অভিযোগ করতে চান তবে তা ঠিক আছে তবে এই অভিযোগগুলির জন্য এটি স্থান নয়।
ড্যানিয়েল প্রাইডেন

1
একটি স্ট্রিং ধ্রুবক পেতে দয়া করে একটি বহু-মেগাবাইট লাইব্রেরি অন্তর্ভুক্ত করবেন না।
জেফ্রি ব্লাটম্যান

50

যদি এই পৃষ্ঠাটি কোনও ওয়েব অনুসন্ধানে আসে, জাভা ১.7 অনুসারে আপনি এখন স্ট্যান্ডার্ড চরসেটগুলির ধ্রুবক সংজ্ঞা অ্যাক্সেস পেতে java.nio.charset.SandardCharsets ব্যবহার করতে পারেন ।


আমি এটি ব্যবহার করার চেষ্টা করছি কিন্তু এটি কাজ করে না বলে মনে হচ্ছে। 'Charset.defaultCharset ());' 'java.nio.charset। *' অন্তর্ভুক্ত করার পরে কাজ করছে বলে মনে হচ্ছে তবে আমি যখন 'ফাইল.রেডআললাইনস' ব্যবহার করার চেষ্টা করছি তখন আমি স্পষ্টতই ইউটিএফ 8 তে উল্লেখ করতে পারি না।
রজার

1
@ রোজার কি সমস্যা বলে মনে হচ্ছে? আমি যা দেখতে পাচ্ছি Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
সেগুলি

সমস্যাটি কী ছিল তা আমি জানি না, তবে এমন কিছু পরিবর্তনের পরে এটি আমার পক্ষে কাজ করেছিল যা আমি মনে করতে পারি না।
রজার

1
Probably আপনাকে সম্ভবত আইডিইতে লক্ষ্য প্ল্যাটফর্মটি পরিবর্তন করতে হয়েছিল। আপনি আইডিই ইনস্টল করার সময় যদি 1.6 আপনার সর্বশেষ জেডিকে হয় তবে সম্ভবত এটি আইডিই এবং জেডিকে উভয়কে নিজের জায়গায় আপডেট করার পরে এটি সম্ভবত ডিফল্ট হিসাবে বেছে নিয়েছে এবং এটিকে ডিফল্ট হিসাবে রেখে দিয়েছে।
Bitbang3r


9

কিছুই নেই (কমপক্ষে স্ট্যান্ডার্ড জাভা লাইব্রেরিতে)। চরিত্রের সেটগুলি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের পরিবর্তিত হয় তাই জাভাতে সেগুলির কোনও মানক তালিকা নেই।

কিছু তৃতীয় পক্ষের লাইব্রেরি রয়েছে যেখানে এই ধ্রুবকগুলি রয়েছে। এর মধ্যে একটি হ'ল পেয়ারা (গুগল কোর লাইব্রেরিগুলি): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


এটি ধরতে আমার এক সেকেন্ড সময় লাগল ... পেয়ারা চরসেটের ধ্রুবক স্ট্রিংস নয়, চরসেট (আশ্চর্য হওয়ার মতো)। ইনপুট স্ট্রিম রিডারটিতে আরও একটি কনস্ট্রাক্টর রয়েছে যা স্ট্রিংয়ের পরিবর্তে চারসেট নেয়। আপনার যদি সত্যিই স্ট্রিংটির প্রয়োজন হয় তবে এটি উদাহরণস্বরূপ চার্সেট UTUTF_8.name ()।
এড স্টাব

1
চরিত্রের সেটগুলি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের পরিবর্তিত হতে পারে তবে ইউটিএফ -8 এর নিশ্চয়তা রয়েছে।
টার 8

3
সংজ্ঞায়িত সমস্ত অক্ষর StandardCharsetsপ্রতিটি প্ল্যাটফর্মের প্রতিটি জাভা প্রয়োগে বিদ্যমান থাকার গ্যারান্টিযুক্ত।
Krzysztof Krasoń

8

আপনি Charset.defaultCharset()API বা ব্যবহার করতে পারেনfile.encoding সম্পত্তি ।

তবে আপনি যদি নিজের ধ্রুবক চান তবে আপনার নিজের এটি সংজ্ঞায়িত করতে হবে।


11
ডিফল্ট চরসেটটি সাধারণত ওএস এবং স্থানীয় সেটিং দ্বারা নিরস্ত করা হয়, আমি মনে করি না যে এটি একাধিক জাভা আহ্বানের জন্য একই রকম রয়েছে যে কোনও গ্যারান্টি নেই। সুতরাং এটি একটি ধ্রুবক পৃথকীকরণ "utf-8" এর কোনও প্রতিস্থাপন নয়।
জর্ন হোর্স্টম্যান

6

জাভাতে 1.7+

"UTF-8" স্ট্রিং ব্যবহার করবেন না, পরিবর্তে Charsetপরামিতি টাইপ ব্যবহার করুন :

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);

4

আপনি যদি জাভা / অ্যান্ড্রয়েডের জন্য OkHttp ব্যবহার করেন তবে আপনি নিম্নলিখিত ধ্রুবকটি ব্যবহার করতে পারেন:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String

2
এটি OkHttp থেকে সরানো হয়েছে, সুতরাং পরবর্তী উপায়টি হ'ল: আপনার Charset.forName("UTF-8").name()যখন API 19+ এর চেয়ে কম অ্যান্ড্রয়েডের জন্য সমর্থন প্রয়োজন তখন অন্যথায় আপনি ব্যবহার করতে পারেন:StandardCharsets.UTF_8.name()
এমট্রাকাল

3

স্ট্যান্ডার্ড জন্য ধ্রুব সংজ্ঞা। এই অক্ষরগুলি জাভা প্ল্যাটফর্মের প্রতিটি প্রয়োগে উপলব্ধ থাকার গ্যারান্টিযুক্ত। 1.7 থেকে

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;

0

org.apache.commons.lang3.CharEncoding.UTF_8জাভা introduced প্রবর্তনের পরে শ্রেণি অবচিত করা হয়েছেjava.nio.charset.StandardCharsets

  • @ জেআরই চরিত্রের এনকোডিংয়ের নামগুলি দেখুন
  • @ সেন্স ২.১
  • @ ডেপ্রেসিটেড জাভা 7 introduced @ লিঙ্ক java.nio.charset.SandardCharsets ets প্রবর্তিত, যা এই ধ্রুবকগুলিকে সংজ্ঞায়িত করে
  • l @ লিঙ্ক চারসেট} অবজেক্ট। এই শ্রেণিতে স্ট্রিংয়ের মান সরবরাহ করতে l @ লিঙ্ক চরসেট # নাম () Use ব্যবহার করুন।
  • ভবিষ্যতে প্রকাশে এই শ্রেণিটি সরানো হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.