ইটারের স্ট্রিমটি জাভাতে চরকে রূপান্তর করা


114

এটি সম্ভবত অন্য কোথা থেকে উত্তর দেওয়া হয়েছে তবে আপনি কীভাবে কোনও মান মানের চরিত্রের মান পাবেন?

বিশেষত আমি একটি টিসিপি স্ট্রিম থেকে একটি পড়ছি এবং পাঠকগুলি read

আমি এটি থেকে একটি চর কীভাবে পেতে পারি?


1
আপনি কোন ডেটা প্রেরণ করছেন এবং পড়ছেন তা আপনি বিশদভাবে জানাননি। আপনি কি বাইনারি বাইট বা ইউনিকোড অক্ষর প্রেরণ করেন? পাঠক .পঠন () পদ্ধতিটি একটি পূর্বাবস্থায় ফিরে আসে। হ্যাঁ, তবে এটি 0 থেকে 65535 (বা -1 এর পরিসীমা) হিসাবে পূর্ণসংখ্যার হিসাবে পঠিত চরিত্রটি ফিরিয়ে দেয় (এটি কারণ আমি মনে করি চারটির পরিবর্তে int ব্যবহার করা হয়েছে)। হয়তো শুধু ব্যবহার public int read(char[] cbuf)করলে সমস্যার সমাধান হবে?
ভানুয়ান

এই প্রশ্নের উত্তর জেএসপি জাভার জন্য কাজ করে না। : আপনি JSP এর ব্যবহার করে থাকেন, এই স্ট্যাক ওভারফ্লো বাগ দেখতে stackoverflow.com/questions/4621836/...
NuclearPeon

আমি মনে করি এটি একটি বৈধ প্রশ্ন। একটি পূর্ণসংখ্যাকে
চরে

আমি যদি বাইট অ্যারেতে থাকা একটি বাইটকে একটি চরিত্রে রূপান্তর করতে এবং তারপরে কনসোলে মুদ্রণ করতে চাই তবে কী হবে?
ডগ হাউফ

উত্তর:


74

আপনি যদি কোনও স্ট্রিমটিকে পাঠ্যে রূপান্তর করতে চাইছেন তবে আপনি কোন এনকোডিংটি ব্যবহার করতে চান সে সম্পর্কে আপনাকে সচেতন হওয়া দরকার। তারপরে আপনি হয় Stringকনস্ট্রাক্টরে একটি বাইটের অ্যারে পাস করতে পারেন এবং একটি সরবরাহ Charsetকরতে পারেন, বা তার পরিবর্তে InputStreamReaderযথাযথ ব্যবহার করতে পারেন Charset

কেবলমাত্র থেকে কাস্ট intকরার charএকমাত্র কাজ যদি তুমি চাও ISO-8859-1- যদি তুমি পড়া সরাসরি একটি স্ট্রীম থেকে বাইট।

সম্পাদনা করুন: আপনি যদি হয় ইতিমধ্যে একটি ব্যবহার Reader, তারপর ফেরত মান ভোটদান read()থেকে char(চেক কিনা এটা -1 বা না পরে) দিক থেকে ঠিক পন্থা ... কিন্তু এটা সাধারণত আরো দক্ষ এবং সুবিধাজনক ডাকতে read(char[], int, int)একটি সম্পূর্ণ ব্লক পড়তে একসাথে পাঠ্য কতগুলি অক্ষর পড়েছে তা দেখতে, যদিও ফেরতের মানটি পরীক্ষা করতে ভুলবেন না।


2
আমি মনে করি এটি ওপি সম্পর্কে জিজ্ঞাসা করছে না। তিনি পাঠকের পঠন পদ্ধতিটি ব্যবহার করছেন: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () তিনি যে প্রশ্নটি জিজ্ঞাসা করছেন তা হল এই পদ্ধতিতে ফেরত মানকে কীভাবে চরে রূপান্তর করা যায়? ।
ভানুয়ান

3
তিনি যদি সত্যই রিডারটি ব্যবহার করেন তবে তা অবশ্যই একটি পার্থক্য করে। তিনি একই বাক্যে একটি স্ট্রিম এবং একটি পাঠক (একটি ছোট মামলার সাথে) সম্পর্কে কথা বলেছেন তা স্পষ্ট নয়: এই বিষয়টি পরিষ্কার করার জন্য আমার উত্তরটি সম্পাদনা করেছেন
জোন স্কিট

আপনার কাছে মোড়ানো পারেন InputStreamReaderএকটি BufferedReader, যেমন javadoc উল্লেখ docs.oracle.com/javase/8/docs/api/java/io/...
bvdb

কেন আপনি "আইএসও -8859-1 চাইলে কেবল ইন্টার থেকে চরে কেবল ingালাই কাজ করে" কেন? এটি কি জাভা অভ্যন্তরীণভাবে ইউটিএফ -16 ব্যবহার করে এবং সমস্ত আইএসও -8859-1 অক্ষর ইউটিএফ -16 এ একই কোড ইউনিট (বিট) রাখে?
সাবস্টিয়ান

@ সেবাস্তিন: হ্যাঁ, এটি মূলত এটি।
জন স্কিটি

144

আপনি চাইছেন:

Character.toChars(65) // returns ['A']

অধিক তথ্য: Character.toChars(int codePoint)

নির্দিষ্ট অক্ষরটিকে (ইউনিকোড কোড পয়েন্ট) রূপান্তর করে তার চর অ্যারেতে সঞ্চিত এটির UTF-16 উপস্থাপনায়। যদি নির্দিষ্ট কোড পয়েন্টটি একটি বিএমপি (বেসিক বহুভাষিক প্লেন বা প্লেন 0) মান হয় তবে ফলাফল প্রাপ্ত অ্যারেটির কোডপয়েন্টের সমান মান থাকে। যদি নির্দিষ্ট কোড পয়েন্টটি পরিপূরক কোড পয়েন্ট হয় তবে ফলিত চর অ্যারেতে সংশ্লিষ্ট সারোগেট জুটি থাকে।


9
এটি কেবলমাত্র বৈধ যদি প্রশ্নে পূর্ণসংখ্যাটি ইতিমধ্যে কোনও UTF-16 কোড পয়েন্ট হয়। ঘটনাটি কিনা তা আমাদের কোনও ধারণা নেই।
জন স্কিটি

2
@ অ্যাক্ট: না, আমার বক্তব্যটি হ'ল তিনি যদি কেবল কোনও ধারা থেকে বাইটস পড়েন (এটি পরিষ্কার নয়) তবে কেবল কাস্টিং বা ব্যবহার করে রূপান্তর toCharsকরা সাধারণত অনুচিত inappropriate তিনি যদি কোনও পাঠকের কাছ থেকে পড়ে থাকেন তবে ঠিক আছে।
জন স্কিটি 23

2
যদিও স্বীকার করা প্রশ্নটি নির্দিষ্ট করে নি, এই প্রশ্নটি ASCII কোড পয়েন্টগুলিকে চরগুলিতে রূপান্তরিত করার জন্য গুগল অনুসন্ধানের প্রথম ফলাফল হিসাবে আসে, সুতরাং আমি এটিকে সমর্থন করছি।
আর্টঅফ ওয়ারফেয়ার

105

এটি "ইন্টকে চরে রূপান্তর করুন" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।

যদি আপনি কেবল ইনট এ মান castালতে চান তবে আপনি জাভার টাইপকাস্ট স্বরলিপি ব্যবহার করে এটি কাস্ট করতে পারেন:

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

আপনি যদি পূর্ণসংখ্য 1 কে '1' অক্ষরে রূপান্তরিত করতে চান তবে আপনি এটি এটি করতে পারেন:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}

আপনি যদি চর থেকে পূর্ণসংখ্যার দিকে যাচ্ছেন? Integer.parseInt (গ)?
প্রজননত্বে

এই উত্তরটি হ'ল এক :-)
ভোগদেভ

29

আপনি যদি কেবল ইনট 5 কে চর '5' তে রূপান্তর করতে চান: (কেবল পূর্ণসংখ্যার জন্য 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';

না .. '0' + 5 স্ট্রিং '05' হয়ে যায়। ডান দিকের দিকটি (চর) ((অন্তর্) '0') + আই হওয়া উচিত;
toddkaufmann

সত্য নয় কারণ অক্ষরগুলি জাভাতে স্ট্রিংগুলিতে রূপান্তরিত হয় না।
কৌশিক শঙ্কর

+1 - চেষ্টা এবং পরীক্ষিত, এটি কার্যকর! চেষ্টা করুন এবং নিজেই এটি পরীক্ষা করুন, আপাতদৃষ্টিতে মন্তব্যকারীদের থেকে আলাদা মনে হচ্ছে ...
আয়ান ক্যাম্পবেল

8

সাধারণ ingালাই:

int a = 99;
char c = (char) a;

এটি আপনার পক্ষে কাজ করছে না এমন কোনও কারণ আছে?


1
বিপজ্জনক পরামর্শ, যদি পাঠ্য প্রবাহটি খাঁটি ASCII না হয়। উপরে জোন স্কিটির উত্তর দেখুন।
sleske

1
এটি কাজ নাও করতে পারে। তবে আমি মনে করি এটি আসলে হবে। চর ডেটা টাইপ ইউটিএফ -16 কোডেড মান সঞ্চয় করে। সুতরাং চার্ট ইন কাস্ট করার জন্য আপনাকে কিছু রূপান্তর করতে হবে। তবে যেহেতু ওপিটি পঠন () পদ্ধতিটি ইতিমধ্যে ইউটিএফ -16 কোডেড মানকে সহজ কাস্টিং প্রদান করে তা আমার মনে হয় কাজ করবে। আমি ভুল হলে আমাকে সংশোধন করুন।
ভানুয়ান 11

দুঃখিত, আমি "
আন্ত

এটি সংখ্যার চেয়ে নয়, অপ্রত্যাশিত এনকোডিংয়ের মান
ঘটাবে

4

এই সমাধানটি পূর্ণসংখ্যার দৈর্ঘ্যের আকার = 1 এর জন্য কাজ করে।

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

যদি আকার> 1 আমাদের লুপের জন্য ব্যবহার করতে হয় এবং এর মাধ্যমে পুনরাবৃত্তি করতে হয়।


1

এখানে বেশিরভাগ উত্তর শর্টকাট প্রস্তাব করে, যা আপনি কী করছেন সে সম্পর্কে যদি আপনার ধারণা না থাকে তবে এটি আপনাকে বড় সমস্যার মধ্যে নিয়ে আসতে পারে। আপনি যদি শর্টকাট নিতে চান তবে আপনার ডেটাটি কী এনকোডিংয়ে রয়েছে তা ঠিক আপনাকে জানতে হবে।

হল UTF-16

যখনই জাভা তার ডকুমেন্টেশনে অক্ষর সম্পর্কে কথা বলে, এটি 16-বিট অক্ষর সম্পর্কে কথা বলে।

আপনি একটি ব্যবহার করতে পারেন DataInputStream, যা সুবিধাজনক পদ্ধতি রয়েছে। দক্ষতার জন্য, এটিকে মুড়ে দিন BufferedReader

// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast

জিনিসটি হ'ল প্রতিটি readChar()প্রকৃতপক্ষে 2 টি সম্পাদন করবে readএবং এগুলিকে একটি 16-বিট চরিত্রের সাথে সংযুক্ত করবে।

ইউএস-হওয়া ASCII

ইউএস-এএসসিআইআই 1 টি অক্ষর এনকোড করার জন্য 8 টি বিট সংরক্ষণ করে। ASCII টেবিলটি কেবলমাত্র 128 টি সম্ভাব্য অক্ষর বর্ণনা করে, তাই 1 বিট সর্বদা অব্যবহৃত থাকে।

আপনি কেবল এক্ষেত্রে একটি কাস্ট অভিনয় করতে পারেন।

int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;

বর্ধিত এএসসিআইআই

ইউটিএফ -8, ল্যাটিন -1, এএনএসআই এবং আরও অনেক এনকোডিং সমস্ত 8-বিট ব্যবহার করে। প্রথম 7-বিট ASCII টেবিলটি অনুসরণ করে এবং US-ASCII এনকোডিংয়ের মতো হয় ident যাইহোক, অষ্টম বিট এমন সমস্ত অক্ষর সরবরাহ করে যা এই সমস্ত এনকোডিংগুলিতে আলাদা। সুতরাং, এখানে জিনিস আকর্ষণীয় পেতে।

আপনি যদি কাউবয় হন এবং আপনি মনে করেন যে 8 তম বিটটি কিছু যায় আসে না (যেমন আপনি "à, é, ç, è, ô ... like এর মতো চরিত্রগুলি সম্পর্কে চিন্তা করেন না) তবে আপনি একটি সহজ নিক্ষেপ করে দূরে যেতে পারেন।

তবে আপনি যদি পেশাদারভাবে এটি করতে চান তবে আপনি যখনই আমদানি / রফতানি পাঠ্য आयात করেন (যেমন সকেট, ফাইল ...) অবশ্যই আপনার অবশ্যই একটি চরসেট নির্দিষ্ট করা উচিত।

সর্বদা চরসেট ব্যবহার করুন

আসুন সিরিয়াস হয়ে যাই। উপরের সমস্ত বিকল্প সস্তা কৌশল। আপনি যদি নমনীয় সফ্টওয়্যারটি লিখতে চান তবে আপনার ডেটা আমদানি / রফতানি করতে আপনার একটি কনফিগারযোগ্য চরসেট সমর্থন করতে হবে। একটি জেনেরিক সমাধান এখানে:

byte[]বাফার ব্যবহার করে আপনার ডেটা পড়ুন এবং String এটিকে চরসেট প্যারামিটার ব্যবহার করে রূপান্তর করতে ।

byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);

InputStreamReaderচরসেট প্যারামিটার দিয়ে ইনস্ট্যান্ট করা যেতে পারে এমনটিও আপনি ব্যবহার করতে পারেন।

আরও একটি সুবর্ণ নিয়ম: সরাসরি কোনও চরিত্রের কাছে সরাসরি বাইট দেবেন না। এটা সর্বদা একটি ভুল।


1

ভাবনাটি হলো এই যে ব্যবহারকারী এইমাত্র literaaly একটি রূপান্তর করতে চেয়েছিলেন উপর আমার উত্তর ভিত্তিবিন্দু intথেকে char, উদাহরণস্বরূপ

Input: 
int i = 5; 
Output:
char c = '5'

এটি ইতিমধ্যে উপরে উত্তর দেওয়া হয়েছে, তবে পূর্ণসংখ্যার মানটি যদি i > 10ব্যবহার করা হয় তবে char array

char[] c = String.valueOf(i).toCharArray();


0

এটি সম্পূর্ণভাবে আগত ডেটার এনকোডিংয়ের উপর নির্ভরশীল।


এটি অনর্থক "উত্তর" এর মতো, আমি ভোটটি নামিয়ে দেব তবে এটির পক্ষে এটির মূল্যও উপযুক্ত নয়।
Lpc_dark

@Lpc_dark এই উত্তরটি আরও সঠিক যে অন্যান্য উত্তরগুলির 90%। আরও তথ্যের জন্য আমার উত্তর দেখুন।
বিভিডিবি

0

সম্ভবত দ্রুততম না:

//for example there is an integer with the value of 5:
int i = 5;

//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0); 

-2

চারটি ইনট বা লম্বা রূপান্তর করার উত্তরটি সহজ কাস্টিং।

উদাহরণস্বরূপ: - আপনি চর '0' কে দীর্ঘ রূপান্তর করতে চান।

সরল castালাই অনুসরণ করুন

Char ch='0';
String convertedChar= Character.toString(ch);  //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);

সম্পন্ন!!


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