Java में char's के लिए int की धारा परिवर्तित करना


114

इसका उत्तर शायद और कहाँ पर दिया गया है, लेकिन आपको एक इंट वैल्यू का चरित्र मूल्य कैसे मिलता है?

विशेष रूप से मैं एक tcp स्ट्रीम और रीडर्स से पढ़ रहा हूँ। () विधि एक int देता है।

मुझे इस से चार कैसे मिलेगा?


1
आपने यह नहीं बताया कि आप क्या डेटा भेज रहे हैं और पढ़ रहे हैं। क्या आप बाइनरी बाइट्स या यूनिकोड वर्ण भेजते हैं? पाठक .read () विधि एक int देता है। हां, लेकिन यह 0 से 65535 (या -1) की सीमा में पूर्णांक के रूप में पढ़ा गया चरित्र लौटाता है, ऐसा इसलिए है क्योंकि मुझे लगता है कि इंट का उपयोग चार के बजाय किया जाता है)। शायद सिर्फ इस्तेमाल public int read(char[] cbuf)करने से समस्या हल हो जाएगी?
वानुअन

इस प्रश्न के उत्तर JSP जावा के लिए काम नहीं करते हैं। यदि आप jsp का उपयोग कर रहे हैं, तो इस स्टैक ओवरफ़्लो बग देखें: stackoverflow.com/questions/4621836/…
NuclearPeon

मुझे लगता है कि यह एक वैध प्रश्न है। एक पूर्णांक को एक
चार्ट में

क्या होगा यदि मैं एक बाइट को बाइट में बदलना चाहता हूं जो कि किसी कैरेक्टर में बाइट अरै में है और फिर इसे कंसोल में प्रिंट करें?
डॉग हैफ

जवाबों:


74

यदि आप किसी स्ट्रीम को टेक्स्ट में बदलने की कोशिश कर रहे हैं, तो आपको इस बात की जानकारी होनी चाहिए कि आप किस एन्कोडिंग का उपयोग करना चाहते हैं। फिर आप Stringकंस्ट्रक्टर में बाइट्स की एक सरणी पास कर सकते हैं और इसके बजाय उपयुक्त के साथ ए Charset, या उपयोग कर सकते हैं ।InputStreamReaderCharset

सीधे शब्दों में से कास्टिंग 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, के रूप में जावाडोक में उल्लेख किया docs.oracle.com/javase/8/docs/api/java/io/...
bvdb

ऐसा क्यों है कि "यदि आप ISO-8859-1 चाहते हैं तो केवल इंट से चार तक कास्टिंग केवल काम करता है"? क्या ऐसा इसलिए है क्योंकि जावा UTF-16 का आंतरिक रूप से उपयोग करता है, और सभी ISO-8859-1 वर्ण समान कोड इकाई (बिट्स) को UTF-16 में रखते हैं?
सेबास्टियन

@ सेबेस्टियन: हाँ, यह मूल रूप से है।
जॉन स्कीट

144

शायद आप के लिए पूछ रहे हैं:

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

और जानकारी: Character.toChars(int codePoint)

निर्दिष्ट चरित्र (यूनिकोड कोड पॉइंट) को एक चार्ट में संग्रहीत UTF-16 प्रतिनिधित्व में परिवर्तित करता है। यदि निर्दिष्ट कोड बिंदु एक BMP (बेसिक मल्टीलिंगुअल प्लेन या प्लेन 0) मान है, तो परिणामी चार सरणी का कोडपॉइंट के समान मूल्य है। यदि निर्दिष्ट कोड बिंदु एक पूरक कोड बिंदु है, तो परिणामी वर्ण सरणी में संबंधित सरोगेट जोड़ी है।


9
यह तभी मान्य होगा जब प्रश्न में पूर्णांक पहले से ही UTF-16 कोड बिंदु हो। हमें पता नहीं है कि क्या मामला है।
जॉन स्कीट

2
@Atec: नहीं, मेरा कहना यह है कि अगर वह सिर्फ एक स्ट्रीम से बाइट्स पढ़ रहा है (यह स्पष्ट नहीं है) तो बस कास्टिंग या उपयोग करके परिवर्तित toCharsकरना आमतौर पर अनुचित है। यदि वह एक पाठक से पढ़ रहा है, तो यह ठीक है।
जॉन स्कीट

2
हालांकि यह प्रश्न स्पष्ट रूप से निर्दिष्ट नहीं किया गया था, यह प्रश्न ASCII कोड बिंदुओं को वर्णों में परिवर्तित करने के लिए Google खोज में पहला परिणाम है, इसलिए मैं इसे बढ़ा रहा हूं।
आर्टऑफवर्फ

105

यह इस बात पर निर्भर करता है कि आप "एक इंट को चेर में बदलें" से क्या मतलब है।

यदि आप केवल इंट में वैल्यू डालना चाहते हैं, तो आप इसे जावा के टाइपकास्ट नोटेशन का उपयोग करके डाल सकते हैं:

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 (ग)?
ब्रीडली

यह उत्तर एक है :-)
voghDev

29

यदि आप इंट 5 को केवल '5' में बदलना चाहते हैं: (केवल पूर्णांक 0 - 9 के लिए)

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

नहीं .. '0' + 5 स्ट्रिंग बन जाता है '05'। राइट-हैंड साइड (चार) ((इंट) '0') + i होना चाहिए;
टॉडकूफमैन

यह सच नहीं है क्योंकि वर्ण जावा में स्ट्रिंग्स में परिवर्तित नहीं होते हैं।
कौशिक शंकर

+1 - कोशिश की और परीक्षण किया, यह काम करता है! कोशिश करें और इसे स्वयं परखें, यहाँ टिप्पणी करने वालों के विपरीत ...
इयान कैंपबेल

8

सरल कास्टिंग:

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

क्या कोई कारण है कि यह आपके लिए काम नहीं कर रहा है?


1
खतरनाक सलाह, यदि पाठ धारा शुद्ध ASCII नहीं है। ऊपर जॉन स्कीट का उत्तर देखें।
sleske

1
यह काम नहीं कर सकता है। लेकिन मुझे लगता है कि यह वास्तव में होगा। चार्ट डेटा प्रकार UTF-16 कोडित मान संग्रहीत करता है। तो int को चार करने के लिए आपको कुछ परिवर्तन करने की आवश्यकता है। लेकिन जब से ओपी रीड () विधि का उपयोग करता है जो पहले से ही UTF-16 कोडित मूल्य सरल कास्टिंग करता है, मुझे लगता है कि काम करेगा। अगर मैं गलत हूं तो मुझे सुधारो।
वानुआन

क्षमा करें, मेरा मतलब था "इंट से लेकर चार तक"
वानुअन

यह अप्रत्याशित एन्कोडिंग मूल्यों का कारण होगा, न कि संख्या
वासिल वेलेव

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-बिट चरित्र में संयोजित करेगा।

US-ASCII

US-ASCII 1 वर्ण को एनकोड करने के लिए 8 बिट्स रखता है। ASCII तालिका केवल 128 संभावित वर्णों का वर्णन करती है, इसलिए 1 बिट हमेशा अप्रयुक्त है।

आप बस इस मामले में एक कलाकार का प्रदर्शन कर सकते हैं।

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

विस्तारित ASCII

UTF-8, लैटिन -1, ANSI और कई अन्य एनकोडिंग सभी 8-बिट्स का उपयोग करते हैं। पहले 7-बिट ASCII तालिका का अनुसरण करते हैं और US-ASCII एन्कोडिंग के समान होते हैं। हालांकि, 8 वां बिट उन पात्रों को प्रदान करता है जो इन सभी एन्कोडिंग में भिन्न हैं। इसलिए, यहां चीजें दिलचस्प हैं।

यदि आप एक चरवाहे हैं, और आपको लगता है कि 8 वीं बिट कोई फर्क नहीं पड़ता है (यानी आप "आ, é, ç, è, ô ..." जैसे पात्रों के बारे में परवाह नहीं करते हैं) तो आप एक साधारण कलाकार के साथ दूर हो सकते हैं।

हालाँकि, यदि आप इसे पेशेवर रूप से करना चाहते हैं, तो आपको वास्तव में जब भी आप आयात / निर्यात पाठ (जैसे सॉकेट, फ़ाइलें ...) आयात करते हैं, तो आपको हमेशा एक चारसेट निर्दिष्ट करना चाहिए।

हमेशा चारसेट का इस्तेमाल करें

चलो गंभीर हो जाओ। उपरोक्त सभी विकल्प सस्ते ट्रिक्स हैं। यदि आप लचीला सॉफ़्टवेयर लिखना चाहते हैं, तो आपको अपने डेटा को आयात / निर्यात करने के लिए एक कॉन्फ़िगर करने योग्य चारसेट का समर्थन करने की आवश्यकता है। यहाँ एक सामान्य समाधान है:

एक byte[]बफर का उपयोग करके अपने डेटा को पढ़ें और String एक चारसेट पैरामीटर का उपयोग करके परिवर्तित करें ।

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

तुम भी InputStreamReaderएक charset पैरामीटर के साथ त्वरित किया जा सकता है जो उपयोग कर सकते हैं।

बस एक और सुनहरा नियम: कभी भी सीधे एक पात्र को बाइट नहीं दें। वह हमेशा एक गलती है।


1

उदाहरण के 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% अन्य उत्तर हैं। अधिक जानकारी के लिए मेरा जवाब देखें।
bvdb

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' को लंबे समय में बदलना चाहते हैं।

सरल कलाकारों का पालन करें

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

किया हुआ!!


वह जो पूछ रहा था उसके ठीक विपरीत।
specializt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.