ইউটিএফ -8 এ এনকোড স্ট্রিং


190

আমার "ñ" চরিত্রটি নিয়ে একটি স্ট্রিং রয়েছে এবং এটিতে আমার কিছু সমস্যা রয়েছে। আমার এই স্ট্রিংটি ইউটিএফ -8 এনকোডিংয়ের এনকোড করা দরকার। আমি এটি এইভাবে চেষ্টা করেছি, তবে এটি কার্যকর হয় না:

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

আমি কীভাবে সেই স্ট্রিংটিকে utf-8 এ এনকোড করব?


2
আপনি ঠিক কী করার চেষ্টা করছেন তা অস্পষ্ট। মাই স্ট্রিংয়ে সঠিকভাবে ñ চরিত্রটি রয়েছে এবং আপনার এটি একটি বাইট অ্যারে রূপান্তর করতে সমস্যা আছে (সে ক্ষেত্রে পিটার এবং আমিরের উত্তর দেখুন), বা মাইস্ট্রিং দুর্নীতিগ্রস্থ হয়েছে এবং আপনি এটি ঠিক করার চেষ্টা করছেন (সেক্ষেত্রে জোয়াচিমের উত্তর দেখুন) এবং আমি)?
মাইকেল বর্গওয়ার্ট

আমাকে মাই স্ট্রিংটি utf-8 এনকোডিং সহ একটি সার্ভারে প্রেরণ করতে হবে এবং আমাকে "ñ" অক্ষরটি utf-8 এনকোডিংয়ে রূপান্তর করতে হবে।
অ্যালেক্স

1
ঠিক আছে, যদি সেই সার্ভারটি ইউটিএফ -8 প্রত্যাশা করে তবে আপনার যা পাঠাতে হবে তা স্ট্রিং নয়, বাইট। পিটারের উত্তর অনুযায়ী, প্রথম লাইনে এনকোডিং নির্দিষ্ট করুন এবং দ্বিতীয় লাইনটি ড্রপ করুন।
মাইকেল বর্গওয়ার্ট

@ মিশেল: আমি সম্মত হই যে এখানে আসল উদ্দেশ্য কী তা পরিষ্কার নয় clear অনেকগুলি প্রশ্ন রয়েছে বলে মনে হচ্ছে যেখানে লোকেরা স্ট্রিংস এবং বাইটগুলির মধ্যে {In,Out}putStream{Read,Writ}ersএটির পরিবর্তে তা করার পরিবর্তে স্পষ্ট রূপান্তর করার চেষ্টা করছে। আমি ভাবছি কেন?
tchrist

1
@ মিশেল: ধন্যবাদ, আমি মনে করি এটি উপলব্ধি হয়ে যায়। তবে এটি এটি হওয়া দরকারের চেয়ে শক্ত করে তোলে, তাই না? আমি সেই ভাষাগুলির খুব পছন্দ করি না এবং সেগুলির সাথে কাজ করা এড়াতে চেষ্টা করি। আমি মনে করি জাওয়ার মডেলের স্ট্রিংসের বাইটের পরিবর্তে জিনিসগুলি পুরোপুরি সহজ করে তোলে। পার্ল এবং পাইথন "সবকিছুই ইউনিকোড স্ট্রিংস" মডেলটি ভাগ করে। হ্যাঁ, তিনটিতেই আপনি যদি এটিতে কাজ করেন তবে আপনি এখনও বাইট পেতে পারেন, তবে বাস্তবে এটি বিরল বলে মনে হচ্ছে আপনার সত্যই প্রয়োজন: এটি বেশ নিম্ন স্তরের। প্লাস এটি একটি বিড়ালকে ভুল দিকটি ব্রাশ করার মতো দারুণ অনুভব করে, যদি আপনি জানেন তবে আমার অর্থ কী। :)
tchrist

উত্তর:


140

String জাভাতে অবজেক্টগুলি ইউটিএফ -16 এনকোডিং ব্যবহার করে যা পরিবর্তিত হতে পারে না।

শুধু একটি ভিন্ন এনকোডিং থাকতে পারে যে একটি হল byte[]। সুতরাং আপনার যদি ইউটিএফ -8 ডেটা প্রয়োজন হয় তবে আপনার একটি দরকার byte[]। যদি আপনার এমন একটি থাকে Stringযা অপ্রত্যাশিত ডেটা ধারণ করে, তবে সমস্যাটি এমন কোনও পূর্ববর্তী স্থানে রয়েছে যা কিছু বাইনারি ডেটা ভুলভাবে একটিতে রূপান্তর করে String(যেমন এটি ভুল এনকোডিং ব্যবহার করছিল)।


92
প্রযুক্তিগতভাবে বলতে গেলে, বাইট [] এর কোনও এনকোডিং নেই। বাইট অ্যারে প্লাস এনকোডিং আপনাকে স্ট্রিং দিতে পারে।
পিটার btibraný

1
@ পিটার: সত্য। তবে এটিকে একটি এনকোডিং সংযুক্ত করা কেবল তার জন্যই বোধগম্য byte[], এটির কোনও অর্থ নেই String(যদি না এনকোডিংটি ইউটিএফ -16 না হয়, তবে এটির ক্ষেত্রে এটি বোধগম্য হয় তবে এটি এখনও অপ্রয়োজনীয় তথ্য)।
জোছিম সৌর

4
String objects in Java use the UTF-16 encoding that can't be modified. আপনার এই উদ্ধৃতিটির জন্য কোনও সরকারী উত্স আছে?
আহমদ হাজর

@ আহমাদহজ্জার ডকস.অরাকল. com / জাভাসে / ১০ / ডকস / এপি / জাভা / আলং / :: "জাভা প্ল্যাটফর্মটি চারটি অ্যারেতে এবং স্ট্রিং এবং স্ট্রিংবফার শ্রেণিতে UTF-16 উপস্থাপনা ব্যবহার করে।"
ম্যাক্সি গিস

173

কিভাবে ব্যবহার সম্পর্কে

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)

পিটারের সাথে আমার আলোচনা দেখুন। তবে যদি প্রশ্নটি সম্পর্কে তাঁর ধারণাটি সঠিক হয় তবে এটি বাইটবফারটি ফেরত দেওয়ার পরেও আপনার সমাধানটি ধারণা হতে পারে না।
মাইকেল বর্গওয়ার্ট

8
তবে আমি কীভাবে একটি এনকোডযুক্ত স্ট্রিং পাব? এটি একটি বাইটবফার
অ্যালেক্স

7
@ অ্যালেক্স: কোনও ইউটিএফ -8 এনকোডেড জাভা স্ট্রিং থাকা সম্ভব নয় । আপনি বাইটস চান, তাই হয় সরাসরি বাইটবফারটি ব্যবহার করুন (এমনকি যদি আপনার লক্ষ্যটি একটি নেটওয়ার্ক সংগ্রহের মাধ্যমে এটি প্রেরণ করা হয় তবে এটি সর্বোত্তম সমাধান হতে পারে) বা বাইট পেতে এতে অ্যারে () কল করুন []
মাইকেল বার্গওয়ার্ড

2
সহায়ক হতে পারে এমন অন্য কিছু হ'ল পেয়ারার চরসেটগুলি ব্যবহার করুন UTUTF_8 এনাম স্ট্রিংয়ের পরিবর্তে একটি অসমর্থিত এনকোডিংএক্সসেপশন ফেলে দিতে পারে। স্ট্রিং -> বাইট: myString.getBytes(Charsets.UTF_8)এবং বাইট -> স্ট্রিং: new String(myByteArray, Charsets.UTF_8)
laughing_man

24
আরও ভাল, ব্যবহার StandardCharsets.UTF_8। জাভা 1.7+ এ উপলব্ধ।
ক্যাট

81

জাভা 7 এ আপনি ব্যবহার করতে পারেন:

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
কোড নমুনাটি বোঝায় না। আপনি যদি প্রথমে আইএসও -8859-1 তে রূপান্তর করেন তবে সেই বাইটের অ্যারেটি ইউটিএফ -8 নয় , সুতরাং পরবর্তী লাইনটি সম্পূর্ণ ভুল। এটা তোলে অবশ্যই, হওয়া ASCII স্ট্রিং জন্য কাজ করবে, কিন্তু তারপর ভাল হিসাবে আপনি একটি সহজ কপি করতে পারে: String value = new String(myString);
অ্যালেক্সিস উইলক

76

byte[] ptext = String.getBytes("UTF-8");পরিবর্তে ব্যবহার করুন getBytes()getBytes()তথাকথিত "ডিফল্ট এনকোডিং" ব্যবহার করে, যা ইউটিএফ -8 নাও হতে পারে।


9
@ মিশেল: স্ট্রিং থেকে বাইট পেতে স্পষ্টতই তার সমস্যা হচ্ছে। গেটবাইটস (এনকোডিং) কীভাবে পয়েন্টটি হারিয়েছে? আমি মনে করি যে দ্বিতীয় লাইনটি কেবল আবার ফিরে আসতে পারে কিনা তা যাচাই করার জন্য।
পিটার btibraný

1
আমি এটি একটি ভাঙ্গা স্ট্রিং থাকা এবং বাইটস এবং ব্যাক (সাধারণ ভুল বোঝাবুঝি) এ রূপান্তর করে এটি "সংশোধন" করার চেষ্টা করে ব্যাখ্যা করি। দ্বিতীয় লাইনে কেবল ফলাফলটি পরীক্ষা করা হচ্ছে এমন কোনও প্রকৃত ইঙ্গিত নেই।
মাইকেল বর্গওয়ার্ট

@ মিশেল, নেই, এটি কেবল আমার ব্যাখ্যা। আপনার কেবল অন্যরকম।
পিটার btibraný

1
@ পিটার: আপনি ঠিক বলেছেন, আলেক্সের তিনি আসলে কী বোঝাতে চেয়েছেন সে সম্পর্কে আমাদের স্পষ্টতা দরকার। উত্তর সম্পাদনা না করা হলেও ডাউনটোটকে উদ্ধার করতে পারবেন না ...
মাইকেল বর্গওয়ার্ট

33

একটি জাভা স্ট্রিং অভ্যন্তরীণভাবে সর্বদা ইউটিএফ -16 এ এনকোড থাকে - তবে আপনার অবশ্যই এটির মতো চিন্তা করা উচিত: একটি এনকোডিং স্ট্রিংস এবং বাইটগুলির মধ্যে অনুবাদ করার একটি উপায়।

সুতরাং আপনার যদি একটি এনকোডিংয়ের সমস্যা থাকে তবে আপনার স্ট্রিংয়ের সময়টি ঠিক করতে খুব দেরী। ফাইল, ডিবি বা নেটওয়ার্ক সংযোগ থেকে আপনি যে স্ট্রিংটি তৈরি করেছেন সেই জায়গাটি আপনাকে ঠিক করতে হবে।


1
এটি বিশ্বাস করা একটি সাধারণ ভুল যে স্ট্রিংগুলি অভ্যন্তরীণভাবে ইউটিএফ -16 হিসাবে এনকোড করা আছে। সাধারণত তারা হয়, তবে যদি এটি কেবল স্ট্রিং ক্লাসের একটি বাস্তবায়ন নির্দিষ্ট বিবরণ। যেহেতু চরিত্রের ডেটার অভ্যন্তরীণ স্টোরেজটি পাবলিক এপিআইয়ের মাধ্যমে অ্যাক্সেসযোগ্য নয়, একটি নির্দিষ্ট স্ট্রিং বাস্তবায়ন অন্য কোনও এনকোডিং ব্যবহার করার সিদ্ধান্ত নিতে পারে।
jarnbjo

4
@ জার্নবজো: এপিআই স্পষ্টভাবে জানিয়েছে "একটি স্ট্রিং ইউটিএফ -16 ফর্ম্যাটে একটি স্ট্রিং উপস্থাপন করে"। অভ্যন্তরীণ ফর্ম্যাট হিসাবে অন্য যে কোনও কিছু ব্যবহার করা অত্যন্ত দক্ষ হবে এবং আমার জানা সমস্ত বাস্তবায়ন অভ্যন্তরীণভাবে ইউটিএফ -16 ব্যবহার করে। সুতরাং আপনি যদি এমন একটি উদ্ধৃত না করতে পারেন তবে আপনি বেশ অযৌক্তিক চুলের ছড়িয়ে পড়ছেন in
মাইকেল বর্গওয়ার্ট

জনসাধারণের অ্যাক্সেস এবং ডেটা স্ট্রাকচারের অভ্যন্তরীণ উপস্থাপনের মধ্যে পার্থক্য করা কি অযৌক্তিক?
জার্নবজো

6
জেভিএম (যতদূর এটি ভিএম-এর সাথে প্রাসঙ্গিক) স্ট্রিং এনকোডিংয়ের জন্য ইউটিএফ -8 ব্যবহার করে, যেমন শ্রেণীর ফাইলগুলিতে। জাভা.এল.আং.স্ট্রিংয়ের বাস্তবায়নটি জেভিএম থেকে ডেকেড হয়েছে এবং আমি অভ্যন্তরীণ উপস্থাপনের জন্য অন্য যে কোনও এনকোডিং ব্যবহার করে আপনার জন্য ক্লাসটি সহজেই বাস্তবায়িত করতে পারতাম যদি তা বুঝতে যে আপনার উত্তরটি ভুল। অভ্যন্তরীণ বিন্যাস হিসাবে ইউটিএফ -16 ব্যবহার করা বেশিরভাগ ক্ষেত্রে মেমরির ব্যবহারের ক্ষেত্রেও অত্যন্ত অদক্ষ এবং আমি দেখতে পাচ্ছি না কেন এম্বেডড হার্ডওয়ারের জন্য জাভা প্রয়োগগুলি পারফরম্যান্সের পরিবর্তে মেমরির জন্য অনুকূল না করবে ize
জার্নবজো

1
@ জার্নবজো: এবং আরও একবার: আপনি যতক্ষণ কোনও জেভিএমের একটি দৃ concrete় উদাহরণ দিতে পারবেন না যার স্ট্যান্ডিংগুলি বাস্তবায়নের জন্য স্ট্যান্ডার্ডগুলি প্রয়োগের জন্য স্ট্যান্ডার্ডগুলি প্রয়োগ করার জন্য অভ্যন্তরীণভাবে ইউটিএফ -16 ব্যতীত অন্য কিছু ব্যবহার করে এমন স্ট্যান্ডার্ড এপিআই প্রয়োগ করে না my এবং না, ইন্টার্ন () এবং ধ্রুবক পুলের মতো জিনিসের কারণে স্ট্রিং ক্লাসটি জেভিএম থেকে সত্যই ডাকা হয় নি।
মাইকেল বর্গওয়ার্ট

22

আপনি এইভাবে চেষ্টা করতে পারেন।

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

1
আমি পাগল হয়ে যাচ্ছিলাম। "ISO-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

নেটবিন্সের ডিফল্ট এনকোডিং ইউটিএফ -8 কীভাবে কনফিগার করতে হয় তাড়াতাড়ি একটি পদক্ষেপ গাইড। ফলস্বরূপ নেটবিয়ান্স ইউটিএফ -8 এনকোডিংয়ে সমস্ত নতুন ফাইল তৈরি করবে।

নেটবিন্স ডিফল্ট এনকোডিং ইউটিএফ -8 ধাপে ধাপে গাইড

  • নেটবিন্স ইনস্টলেশন ডিরেক্টরিতে ইত্যাদি ফোল্ডারে যান

  • নেটবিয়ানস কনফ ফাইলটি সম্পাদনা করুন

  • নেটবিয়ান_ডিফল্ট_পোশন লাইনটি সন্ধান করুন

  • যুক্ত -J-Dfile.encoding = ইউটিএফ -8 যে লাইনের ভিতরে উদ্ধৃতি চিহ্ন

    (উদাহরণ netbeans_default_options="-J-Dfile.encoding=UTF-8":)

  • নেটবিয়ান পুনরায় আরম্ভ করুন

আপনি নেটবিয়ান্সের ডিফল্ট এনকোডিং ইউটিএফ -8 সেট করেছেন।

আপনার নেটবিয়ান_ডিফল্ট_অপশনগুলিতে উদ্ধৃতি চিহ্নের ভিতরে অতিরিক্ত পরামিতি থাকতে পারে। সেক্ষেত্রে স্ট্রিংয়ের শেষে -J-Dfile.encoding = UTF-8 যুক্ত করুন। অন্যান্য পরামিতিগুলি থেকে স্থানটি পৃথক করুন।

উদাহরণ:

নেটবিয়ানস_ডিফল্ট_অপশন = "- জে-ক্লায়েন্ট-জে-এক্সএস 128 এম-জে-এক্সএম 256 এম-জে-এক্সএক্স: পার্মসাইজ = 32 মি-জে-ড্যাপল.লাফ.উজ.স্ক্রিনমেনুবার = সত্য-জে-ড্যাপল.ওট.গ্রাফিক্স.উসেকুয়ার্টজ = সত্য-জে-ডসুন। java2d.noddraw = true -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true -J-Dfile.encoding = UTF-8 "

এখানে লিঙ্ক আরও বিস্তারিত জানার জন্য


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