जावा, अनजाने में नहीं, यूनिकोड वर्णों को देशी सिस्टम एन्कोडेड बाइट्स में एन्कोड करता है इससे पहले कि यह उन्हें stdout
पर लिखता है। कुछ ऑपरेटिंग सिस्टम, जैसे कि कई लिनक्स डिस्ट्रोज़, UTF-8
का उपयोग अपने डिफ़ॉल्ट चरित्र सेट के रूप में करते हैं, जो कि अच्छा है।
विंडोज़ पर विभिन्न प्रकार के पीछे-संगतता कारणों के लिए चीजें अलग-अलग हैं। डिफ़ॉल्ट सिस्टम एन्कोडिंग "ANSI" कोडपेजों में से एक होगी और यदि आप डिफ़ॉल्ट कमांड प्रॉम्प्ट (cmd.exe) खोलते हैं तो यह पुराने "OEM" डॉस कोडपेजों में से एक होगा (हालांकि एएनएसआई और यूनिकोड प्राप्त करना संभव है with a bit of work)।
चूंकि यू +0308 किसी भी "एएनएसआई" चरित्र सेट में नहीं है (शायद आपके मामले में 1252), तो यह एक त्रुटि वर्ण (आमतौर पर एक प्रश्न चिह्न) के रूप में एन्कोड किया जाएगा।
सब कुछ यूनिकोड-सक्षम करने के लिए एक वैकल्पिक normalize के संयोजन अनुक्रम U + 0069 U + 0308 एकल वर्ण U + 00EF के लिए है:
public static void emit(String foo) throws IOException {
System.out.println("Literal: " + foo);
System.out.print("Hex: ");
for (char ch : foo.toCharArray()) {
System.out.print(Integer.toHexString(ch & 0xFFFF) + " ");
}
System.out.println();
}
public static void main(String[] args) throws IOException {
String foo = "\u0069\u0308";
emit(foo);
foo = Normalizer.normalize(foo, Normalizer.Form.NFC);
emit(foo);
}
तहत windows-1252
, इस कोड को फेंकना होगा:
Literal: i?
Hex: 69 308
Literal: ï
Hex: ef
+1: टर्मिनल (gnome-terminal) में उबंटू 9.04 पर आउटपुट मैं डायरेरेसिस के साथ हूं क्योंकि आप शायद इसकी अपेक्षा करते हैं। –
मुझे यह शब्द "डायरेरेसिस" पसंद है। बातचीत में इसे अक्सर इस्तेमाल करना पड़ सकता है। – skaffman
:) "उमलॉट" भी आज़माएं, और आप शाम का आदमी बन जाएंगे। –