2010-06-15 10 views
13

निम्नलिखित (उदाहरण) रनिंग कोडजावा InputStream एन्कोडिंग/चारसेट

import java.io.*; 

public class test { 
    public static void main(String[] args) throws Exception { 
     byte[] buf = {-27}; 
     InputStream is = new ByteArrayInputStream(buf); 
     BufferedReader r = new BufferedReader(
       new InputStreamReader(is, "ISO-8859-1")); 
     String s = r.readLine(); 
     System.out.println("test.java:9 [byte] (char)" + (char)s.getBytes()[0] + 
       " (int)" + (int)s.getBytes()[0]); 
     System.out.println("test.java:10 [char] (char)" + (char)s.charAt(0) + 
       " (int)" + (int)s.charAt(0)); 
     System.out.println("test.java:11 string below"); 
     System.out.println(s); 
     System.out.println("test.java:13 string above"); 
    } 
} 

मुझे इस उत्पादन

 
test.java:9 [byte] (char)? (int)63 
test.java:10 [char] (char)? (int)229 
test.java:11 string below 
? 
test.java:13 string above 

मैं कैसे लाइन -9 में सही बाइट मूल्य (-27) को बनाए रखने है देता है प्रिंट आउट? और इसके परिणामस्वरूप System.out.println(s) कमांड (å) के अपेक्षित आउटपुट प्राप्त करें।

उत्तर

19

यदि आप बाइट मानों को बनाए रखना चाहते हैं, तो आदर्श रूप से रीडर का उपयोग न करें। पाठ में मनमाना बाइनरी डेटा का प्रतिनिधित्व करने के लिए और इसे बाद में बाइनरी डेटा में परिवर्तित करने के लिए, आपको बेस 16 या बेस 64 एन्कोडिंग का उपयोग करना चाहिए।

हालांकि, क्या हो रहा है, जब आप s.getBytes() कि डिफ़ॉल्ट वर्ण एन्कोडिंग, जो जाहिरा तौर पर यूनिकोड वर्ण U + 00E5 शामिल नहीं है उपयोग कर रहा है फोन की व्याख्या करने के।

आप s.getBytes("ISO-8859-1")s.getBytes() के बजाय हर जगह फोन अगर मैं तुम्हें सही बाइट मूल्य वापस मिल जाएगा संदेह है ... लेकिन इस के लिए ISO-8859-1 पर निर्भर IMO थोड़े गंदा है।

+0

s.getBytes ("आईएसओ -885 9 -1") ने चाल की, धन्यवाद। मैं केवल उस डेटा को ट्रैक करने के लिए इसका उपयोग कर रहा था जहां फ़ाइल को पढ़ने के लिए फ़ाइल को पढ़ने से पथ में बदल दिया गया था। – Tobbe

+0

@Tobbe: खुशी है कि यह मदद की। यह बेहतर होगा कि भविष्य में इसे पाठ में परिवर्तित न करें। जब तक यह वास्तव में * आईएसओ -885 9 -1 एन्कोडेड टेक्स्ट फ़ाइल नहीं है, बेशक। –

6

जैसा कि उल्लेख किया गया है, getBytes() (नो-तर्क) जावा प्लेटफार्म डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जो आईएसओ -885 9 -1 नहीं हो सकता है। बस इसे प्रिंट करना चाहिए, अपना टर्मिनल और डिफ़ॉल्ट एन्कोडिंग मैच प्रदान करें और चरित्र का समर्थन करें। उदाहरण के लिए, मेरे सिस्टम पर, टर्मिनल और डिफ़ॉल्ट जावा एन्कोडिंग दोनों यूटीएफ -8 दोनों हैं। तथ्य यह है कि आप एक '?' देख रहे हैं इंगित करता है कि आपका मिलान नहीं है या समर्थित नहीं है।

आप मैन्युअल रूप से आपके सिस्टम पर UTF-8 में सांकेतिक शब्दों में बदलना चाहते हैं, करते हैं:

String s = r.readLine(); 
byte[] utf8Bytes = s.getBytes("UTF-8"); 

यह {-61, -91} के साथ एक बाइट सरणी देना चाहिए।

+0

'getBytes()' प्लेटफ़ॉर्म डिफ़ॉल्ट एन्कोडिंग ** iff ** का उपयोग करता है, कोई तर्क संस्करण नहीं कहा जाता है। –