2011-07-08 9 views
31

में एन्कोड किया गया है, तो मैं कैसे जांच सकता हूं कि एक स्ट्रिंग वैध यूटीएफ -8 प्रारूप में है या नहीं?जांचें कि क्या स्ट्रिंग वैध यूटीएफ -8 जावा

+5

आप बाइट [] वैध एन्कोड किया गया है मतलब? – bestsss

+0

ऐसा करने की सबसे आसान बात यह हो सकती है कि इसे डीकोड करें और इसे फिर से एन्कोड करें। जांचें कि आपको वही चीज़ मिलती है। यह लगभग हर मामले में सही होगा। –

+0

@ पीटर जो हमेशा काम नहीं करेगा, क्योंकि कुछ पात्र बाइट्स के विभिन्न अनुक्रमों के साथ एन्कोड किए जा सकते हैं। बाइट्स के दोनों अनुक्रम सही होंगे, और समान वर्णों को एन्कोड करेंगे, लेकिन बाइट अलग हैं। – Jesper

उत्तर

31

केवल बाइट डेटा की जांच की जा सकती है। यदि आपने स्ट्रिंग का निर्माण किया है तो यह पहले से ही यूटीएफ -16 में आंतरिक रूप से है।

केवल बाइट सरणी यूटीएफ -8 एन्कोडेड हो सकती है।

यहां यूटीएफ -8 रूपांतरणों का एक आम मामला है।

String myString = "\u0048\u0065\u006C\u006C\u006F World"; 
System.out.println(myString); 
byte[] myBytes = null; 

try 
{ 
    myBytes = myString.getBytes("UTF-8"); 
} 
catch (UnsupportedEncodingException e) 
{ 
    e.printStackTrace(); 
    System.exit(-1); 
} 

for (int i=0; i < myBytes.length; i++) { 
    System.out.println(myBytes[i]); 
} 

आप अपनी बाइट सरणी की एन्कोडिंग को नहीं जानते हैं, juniversalchardet एक पुस्तकालय आप इसे पता लगाने में मदद करने के लिए है।

+4

बस एक स्पष्टीकरण के रूप में, स्ट्रिंग का एक उदाहरण यूटीएफ -16 एन्कोडिंग फॉर्म में नहीं है, कड़ाई से बोल रहा है, क्योंकि यह बीमार गठित कोड इकाई अनुक्रमों (पृथक सरोगेट कोड इकाइयों के रूप में) की अनुमति देता है। हालांकि, यह एक यूनिकोड 16-बिट स्ट्रिंग है। –

+4

और भी कड़ाई से बोलते हुए, जावा स्ट्रिंग भी एक वास्तविक यूनिकोड 16-बिट स्ट्रिंग नहीं है, क्योंकि इसमें [सरोगेट्स] हो सकता है (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/ ओपनजेडके/6-बी 14/सूर्य/एनओओ/सीएस/सरोगेट.जावा) यूसीएस 4 (3- और 4-बाइट) पात्रों के लिए। – rustyx

+0

आईसीयू 4 जे एक और जावा लाइब्रेरी है जो आपको बाइट सरणी के एन्कोडिंग का पता लगाने में मदद कर सकती है: http://site.icu-project.org/ –

1

निम्नलिखित पोस्ट आधिकारिक जावा ट्यूटोरियल से उपलब्ध है: https://docs.oracle.com/javase/tutorial/i18n/text/string.html पर उपलब्ध है।

String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C"); 

जब मुद्रित, स्ट्रिंग मूल नामित के रूप में प्रकट होता है::

AêñüC 

UTF को स्ट्रिंग ऑब्जेक्ट परिवर्तित करने के लिए

StringConverter कार्यक्रम एक स्ट्रिंग यूनिकोड वर्ण युक्त बनाने के द्वारा शुरू होता है -8, GetBytes विधि का आह्वान करें और पैरामीटर के रूप में उपयुक्त एन्कोडिंग पहचानकर्ता निर्दिष्ट करें। getBytes विधि UTF-8 प्रारूप में बाइट्स की एक सरणी देता है। गैर-यूनिकोड बाइट्स की सरणी से स्ट्रिंग ऑब्जेक्ट बनाने के लिए, एन्कोडिंग पैरामीटर के साथ स्ट्रिंग कन्स्ट्रक्टर का आह्वान करें। कोड इन कॉल करता है कि एक कोशिश ब्लॉक में संलग्न है, मामले में निर्दिष्ट एन्कोडिंग असमर्थित है:

try { 
    byte[] utf8Bytes = original.getBytes("UTF8"); 
    byte[] defaultBytes = original.getBytes(); 

    String roundTrip = new String(utf8Bytes, "UTF8"); 
    System.out.println("roundTrip = " + roundTrip); 
    System.out.println(); 
    printBytes(utf8Bytes, "utf8Bytes"); 
    System.out.println(); 
    printBytes(defaultBytes, "defaultBytes"); 
} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} 

बाहर utf8Bytes में मूल्यों और defaultBytes सरणियों StringConverter कार्यक्रम प्रिंट एक महत्वपूर्ण बिंदु प्रदर्शित करने के लिए: की लंबाई परिवर्तित टेक्स्ट टेक्स्ट की लंबाई के समान नहीं हो सकती है। कुछ यूनिकोड वर्ण एकल बाइट्स में अनुवाद करते हैं, अन्य जोड़े या बाइट्स के तीन गुना में अनुवाद करते हैं। प्रिंटबाइट विधि बाइट एरो को बाइटटेहेक्स विधि का आह्वान करके प्रदर्शित करती है, जिसे स्रोत फ़ाइल, यूनिकोडफॉर्मेटर.जावा में परिभाषित किया गया है। यहां प्रिंटबाइट विधि है:

public static void printBytes(byte[] array, String name) { 
    for (int k = 0; k < array.length; k++) { 
     System.out.println(name + "[" + k + "] = " + "0x" + 
      UnicodeFormatter.byteToHex(array[k])); 
    } 
} 

प्रिंटबाइट विधि का आउटपुट निम्नानुसार है। ध्यान दें कि केवल पहले और पिछले बाइट्स, ए और सी अक्षर, दोनों सरणियों में ही कर रहे हैं:

utf8Bytes[0] = 0x41 
utf8Bytes[1] = 0xc3 
utf8Bytes[2] = 0xaa 
utf8Bytes[3] = 0xc3 
utf8Bytes[4] = 0xb1 
utf8Bytes[5] = 0xc3 
utf8Bytes[6] = 0xbc 
utf8Bytes[7] = 0x43 
defaultBytes[0] = 0x41 
defaultBytes[1] = 0xea 
defaultBytes[2] = 0xf1 
defaultBytes[3] = 0xfc 
defaultBytes[4] = 0x43 
संबंधित मुद्दे