मुझे java.lang.String
से और यूटीएफ -16 बाइट सरणी को एन्कोड/डीकोड करने की आवश्यकता है। बाइट एरे मुझे Byte Order Marker (BOM) के साथ दिए गए हैं, और मुझे बीओएम के साथ बाइट एरे एन्कोड करने की आवश्यकता है।मैं बीओएम के साथ यूटीएफ -16LE बाइट एरे को एन्कोड/डीकोड कैसे करूं?
इसके अलावा, क्योंकि मैं एक Microsoft क्लाइंट/सर्वर से निपट रहा हूं, मैं किसी भी गलतफहमी से बचने के लिए छोटे एंडियन (LE BOM के साथ) में एन्कोडिंग उत्सर्जित करना चाहता हूं। मुझे एहसास है कि बीओएम के साथ इसे बड़े एंडियन काम करना चाहिए, लेकिन मैं विंडोज़ दुनिया में अपस्ट्रीम नहीं तैरना चाहता हूं।
public static byte[] encodeString(String message) {
byte[] tmp = null;
try {
tmp = message.getBytes("UTF-16LE");
} catch(UnsupportedEncodingException e) {
// should not possible
AssertionError ae =
new AssertionError("Could not encode UTF-16LE");
ae.initCause(e);
throw ae;
}
// use brute force method to add BOM
byte[] utf16lemessage = new byte[2 + tmp.length];
utf16lemessage[0] = (byte)0xFF;
utf16lemessage[1] = (byte)0xFE;
System.arraycopy(tmp, 0,
utf16lemessage, 2,
tmp.length);
return utf16lemessage;
}
जावा में यह करने के लिए सबसे अच्छा तरीका क्या है:
एक उदाहरण के रूप में, यहाँ एक तरीका है जिसके एक बीओएम के साथ थोड़ा endian में एक java.lang.String
UTF-16
के रूप में encodes है? आदर्श रूप से मैं पूरे बाइट सरणी को एक नए बाइट सरणी में कॉपी करने से बचना चाहता हूं जिसमें शुरुआत में आवंटित दो अतिरिक्त बाइट हैं।
ही इस तरह के एक स्ट्रिंग डीकोड करने के लिए चला जाता है, लेकिन वह बहुत अधिक सरल का उपयोग करके है java.lang.String
constructor:
public String(byte[] bytes,
int offset,
int length,
String charsetName)
धन्यवाद:
यहाँ मैं के साथ समाप्त हो गया है! हालांकि एक और मुद्दा ... "यूटीएफ -16" का उपयोग डेटा को बिग एंडियन के रूप में एन्कोड करता है, जो मुझे संदेह है कि माइक्रोसॉफ्ट डेटा के साथ अच्छा नहीं होगा (भले ही बीओएम मौजूद है)। जावा के साथ बीओएम के साथ यूटीएफ -16LE एन्कोड करने का कोई तरीका? मैं अपने प्रश्न को अद्यतन करने के लिए अपडेट करूंगा कि मैं वास्तव में क्या देख रहा था ... –
उसने दिए गए "इस पोस्ट को देखें" लिंक पर क्लिक करें। असल में, आप अपनी स्ट्रिंग की शुरुआत में एक \ uFEFF वर्ण भरते हैं, और फिर यूटीएफ -16LE में एन्कोड करते हैं, और परिणाम में उचित बीओएम होगा। –
"यूनिकोड लिटल" का उपयोग करें (मान लें कि आपका जेआरई इसका समर्थन करता है - ("\ uEFFF" + "मेरी स्ट्रिंग")। GetBytes ("UTF-16LE") अन्यथा)। हालांकि मुझे आश्चर्य होगा कि माइक्रोसॉफ्ट एपीआई ने बीओएम की उम्मीद की लेकिन बड़े एंडियन डेटा को संभाल नहीं सके - वे अन्य प्लेटफार्मों की तुलना में बीओएम का उपयोग करना पसंद करते हैं। खाली तारों के साथ परीक्षण करें - यदि कोई डेटा नहीं है तो आपको रिक्त सरणी मिल सकती हैं। – McDowell