2011-11-09 9 views
15

एक स्ट्रिंग अक्षर में एक पूरक यूनिकोड चरित्र (कहें, कोडपॉइंट 10400) कैसे डालें? मैं इस तरह एक सरोगेट जोड़ी डाल की कोशिश की है:एक स्ट्रिंग अक्षर में एक पूरक यूनिकोड चरित्र कैसे रखा जाए?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

लेकिन यह काम करने के लिए प्रतीत नहीं होता।

अद्यतन:

अच्छी खबर है, स्ट्रिंग ठीक से निर्माण किया है।
UTF-8 में बाइट सरणी: 54 45 53 54 20 f0 UTF-16 में 90 90 80
बाइट सरणी: फ़े एफएफ 0 54 0 45 0 53 0 54 0 20 d8 1 डीसी 0

लेकिन बुरी समाचार यह है कि यह ठीक से मुद्रित नहीं है (मेरे फेडोरा बॉक्स में) और मैं अपेक्षित प्रतीक के बजाय एक वर्ग देख सकता हूं (मेरा कंसोल यूनिकोड को सही तरीके से समर्थन नहीं करता है)।

+2

क्या मतलब है जब आप कहते हैं कि यह काम करने के लिए प्रतीत नहीं होता? 'Text.charAt (5)' का मूल्य क्या है? – Mats

+0

यह प्रतीक को सही तरीके से मुद्रित नहीं करता है। यह आउटपुट स्ट्रीम के साथ कुछ हो सकता है। – n0rm1e

+0

मेरा मानना ​​है कि "एक छोटा बॉक्स" का उपयोग ऐसे चरित्र का प्रतिनिधित्व करने के लिए किया जाता है जिसके लिए सिस्टम प्रदर्शित नहीं हो सकता है। इसका मतलब यह हो सकता है कि आपके प्रदर्शन में उपयोग किया जाने वाला फ़ॉन्ट जहां आप आउटपुट देखने की कोशिश कर रहे हैं, उस चरित्र के लिए ग्लिफ प्रदान नहीं करता है। – neuralmer

उत्तर

12

"मेरे लिए काम करता है", वास्तव में क्या मुद्दा है?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

आउटपुट:

cp: 66560 
found: 66560 
len: 7 

ध्यान दें कि लंबाई - सबसे स्ट्रिंग तरीकों की तरह - char रों, नहीं यूनिकोड वर्ण से संबंधित है। भयानक यूनिकोड समर्थन के लिए बहुत कुछ :)

हैप्पी कोडिंग।

+0

'सीपी: 66560' ' मिला: 66560' –

+0

धन्यवाद, ऐसा लगता है कि आउटपुट स्ट्रीम में कुछ गड़बड़ है, क्योंकि बाइट [] मुझे text.getBytes() से मिलता है। – n0rm1e

+2

@ houman001 * हमेशा * याद रखें - उन मामलों को छोड़कर जिन्हें मैं अब जानता हूं;) - 'getBytes' के साथ एक एन्कोडिंग निर्दिष्ट करें :) इसे लेस्ट करें" प्लेटफॉर्म के डिफ़ॉल्ट वर्णमाला का उपयोग करके इस स्ट्रिंग को बाइट्स के अनुक्रम में एन्कोड करें ** ** "। 'नई स्ट्रिंग (बाइट []) 'के लिए समान है। यदि सही एन्कोडिंग का उपयोग किया जाता है (निर्दिष्ट या अन्यथा) तो स्ट्रीम में भेजा गया आउटपुट सही होना चाहिए: लेकिन दूसरी ओर प्रोग्राम (या टर्मिनल) सहमत नहीं हो सकता है। –

4

यह का उपयोग कर काम करने के लिए माना जाता है:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

लेकिन उत्पादन होता है:

text = ? 
+2

मान लीजिए एच सही है: 'सिस्टम।सिस्टम 'डिफ़ॉल्ट वर्णमाला में डेटा एन्कोड करता है (यह एक हानिकारक रूपांतरण हो सकता है); जिस डिवाइस को आप लिख रहे हैं उसे उसी वर्णसेट का उपयोग करना चाहिए (हमेशा मामला नहीं); डिवाइस को उस ग्रैफेम के लिए फ़ॉन्ट समर्थन होना चाहिए जिसे आप प्रदर्शित करना चाहते हैं। – McDowell

+3

उल्लेख नहीं है कि अगर हम विंडोज कंसोल के बारे में बात कर रहे हैं: जब जावा के रूप में stdio फ़ंक्शंस का उपयोग करके एक्सेस किया जाता है, तो यह टूटा हुआ है और एएनएसआई कोड पेज के बाहर के पात्रों का सामना नहीं कर सकता है (एस्ट्रल प्लेन से अकेले अक्षर दें) । – bobince

संबंधित मुद्दे