इसकी संख्या से यूनिकोड चरित्र बनाना


114

मैं जावा में एक यूनिकोड चरित्र प्रदर्शित करना चाहता हूं। अगर मैं ऐसा करता हूं, तो यह ठीक काम करता है:

String symbol = "\u2202";

प्रतीक "∂" के बराबर है। मैं यही चाहता था।

समस्या यह है कि मैं यूनिकोड संख्या जानता हूं और उससे यूनिकोड प्रतीक बनाने की आवश्यकता है। मैंने (स्पष्ट) कोशिश की:

int c = 2202;
String symbol =  "\\u" + c;

हालांकि, इस मामले में, प्रतीक "\ u2202" के बराबर है। यही तो मैं नहीं चाहता।

अगर मैं इसका यूनिकोड नंबर जानता हूं (लेकिन केवल रन-टाइम --- मैं इसे पहले उदाहरण की तरह हार्ड-कोड नहीं कर सकता) तो मैं कैसे प्रतीक का निर्माण कर सकता हूं?


1
पहला बैकस्लैश निकालें, ताकि बैकस्लैश से बचने के बजाय यह यूनिकोड अनुक्रम से बच जाए। "\\" का उपयोग करना जावा को बताता है कि आप "\" प्रिंट करना चाहते हैं, यूनिकोड वर्णों के लिए भागने के क्रम के अतीत के रूप में इसका उपयोग न करें। यदि आप पहले को हटाते हैं तो यह यूनिकोड अनुक्रम से बच जाएगा, न कि दूसरा बैकस्लैश। कम से कम, यह मेरे ज्ञान का सबसे अच्छा करने के लिए होगा।
निधि मोनिका का मुकदमा

जवाबों:


73

बस अपने intको कास्ट करो char। आप इसे एक Stringप्रयोग में बदल सकते हैं Character.toString():

String s = Character.toString((char)c);

संपादित करें:

बस याद रखें कि जावा स्रोत कोड ( \uबिट्स) में भागने के क्रम एचईएक्स में हैं, इसलिए यदि आप एक भागने के क्रम को पुन: उत्पन्न करने की कोशिश कर रहे हैं, तो आपको कुछ की आवश्यकता होगी int c = 0x2202


3
वह बस मुझे एक वर्ग बॉक्स दे रहा है, square। यह मुझे "∂" नहीं दे रहा है।
पॉल रेइनर्स

19
खतरे, रॉबिन्सन! यह मत भूलो कि यूनिकोड कोड अंक एक चार में जरूरी नहीं होगा । तो आपको समय से पहले यह सुनिश्चित करने की आवश्यकता है कि आपका मान c0x10000 से छोटा है, अन्यथा यह दृष्टिकोण बुरी तरह से टूट जाएगा।
डेविड ने

1
@NickHartley क्षमा करें, अनुसरण न करें --- क्या आपने 10000 के लिए 0x10000 को गलत लिखा था?
डेविड ने

10
इसलिए मैंने below नीचे ’कहा! और मुझे इस पर ज़ोर देने की आवश्यकता है, इस तथ्य के बावजूद कि जावा चार्ट केवल 0xffff तक जाता है, यूनिकोड कोड पॉइंट 0xfffff तक जाता है। जावा डिजाइन किए जाने के बाद यूनिकोड मानक बदल गया। इन दिनों जावा चार्ट तकनीकी रूप से यूटीएफ -16 शब्दों को पकड़ते हैं, न कि यूनिकोड कोड बिंदुओं को, और यह भूल जाने से जब आपका एप्लिकेशन एक विदेशी स्क्रिप्ट का सामना करता है, तो वह भयंकर टूटना होगा।
डेविड

3
@DavidGiven के लिए धन्यवाद Java chars go up to 0xFFFF। मैं नहीं जानता था कि।
टोनी एननिस

128

यदि आप एक UTF-16 एन्कोडेड कोड यूनिट को एक के रूप में प्राप्त करना चाहते हैं char, तो आप पूर्णांक को पार्स कर सकते हैं और इसे दूसरों को सुझाव दे सकते हैं।

यदि आप सभी कोड बिंदुओं का समर्थन करना चाहते हैं, तो उपयोग करें Character.toChars(int)। यह उन मामलों को हैंडल करेगा जहां कोड पॉइंट एक charमूल्य में फिट नहीं हो सकते ।

डॉक्टर कहते हैं:

निर्दिष्ट वर्ण (यूनिकोड कोड बिंदु) को एक चार्ट में संग्रहीत UTF-16 प्रतिनिधित्व में परिवर्तित करता है। यदि निर्दिष्ट कोड बिंदु एक BMP (बेसिक मल्टीलिंगुअल प्लेन या प्लेन 0) मान है, तो परिणामी चार सरणी का कोडपॉइंट के समान मूल्य है। यदि निर्दिष्ट कोड बिंदु एक पूरक कोड बिंदु है, तो परिणामी चार सरणी में संबंधित सरोगेट जोड़ी है।


हालांकि यह एक अधिक सामान्य समाधान है और कई मामलों में आपको इसका उपयोग स्वीकार किए गए उत्तर पर करना चाहिए, स्वीकृत उत्तर उस विशिष्ट समस्या के लिए एक मेल है जो पॉल ने माँगी थी।
जोकेम कुइजपर्स

2
सबसे पहले, धन्यवाद! स्काला में, मैं अभी भी उन वर्णों को पार्स करने में असमर्थ हूं जो एक से बड़े हैं charscala> "👨‍🎨".map(_.toInt).flatMap((i: Int) => Character.toChars(i)).map(_.toHexString)देता है res11: scala.collection.immutable.IndexedSeq[String] = Vector(f468, 200d, f3a8) यह इमोजी, "पुरुष गायक", तीन कोड अंकों के साथ संबोधित किया जाता है U+1f468, U+200dऔर U+1f3a8। सबसे महत्वपूर्ण अंक गायब है। मैं इसे एक बिटवाइस या ( stackoverflow.com/a/2220476/1007926 ) के साथ जोड़ सकता हूं , लेकिन यह नहीं जानता कि कैसे निर्धारित किया गया है कि किन पात्रों को काट दिया गया है। धन्यवाद!
पीटर बेसिक

1
@JochemKuijpers मैं इस बात से सहमत नहीं हूं कि "स्वीकृत उत्तर विशिष्ट समस्या का एक करीबी मेल है" । ओपी ने स्पष्ट रूप से पूछा " यदि मैं इसका यूनिकोड नंबर जानता हूं तो मैं कैसे प्रतीक का निर्माण कर सकता हूं ...?" , और यदि "यूनिकोड संख्या" बीएमपी के बाहर है, तो स्वीकृत उत्तर काम नहीं कर सकता है। उदाहरण के लिए, स्वीकृत उत्तर मान्य कोडपॉइंट 0x1040C के लिए विफल रहता है क्योंकि यह एसएमपी में है। यह एक खराब उत्तर है, और इसे ठीक या हटा दिया जाना चाहिए।
स्कोमीसा

@skomisa OPs परिदृश्य हेक्साडेसिमल यूनिकोड एस्केप अनुक्रम के प्रतिनिधित्व तक सीमित है। यदि आपके पास एक चरित्र है जिसे एक सरोगेट जोड़ी के रूप में एन्कोड किया जाना चाहिए, तो वह इन एस्केप दृश्यों में परिलक्षित होता है, इसलिए यह अभी भी अंत में काम करता है। जैसा कि मैंने कहा, यह एक अधिक सामान्य समाधान है और आपको इसका उपयोग करना चाहिए।
जोकेम कूइजपर्स

20

यहां अन्य उत्तर या तो केवल यू + एफएफएफएफ (केवल एक उदाहरण से निपटने के लिए चार) के यूनिकोड का समर्थन करते हैं या वास्तविक प्रतीक को प्राप्त करने का तरीका नहीं बताते हैं (वर्ण.चक्र पर रोक जवाब) (या गलत विधि का उपयोग कर) उसके बाद), इसलिए यहाँ भी मेरा उत्तर जोड़ रहा हूँ।

अनुपूरक कोड बिंदुओं का भी समर्थन करने के लिए, यह वही किया जाना चाहिए:

// this character:
// http://www.isthisthingon.org/unicode/index.php?page=1F&subpage=4&glyph=1F495
// using code points here, not U+n notation
// for equivalence with U+n, below would be 0xnnnn
int codePoint = 128149;
// converting to char[] pair
char[] charPair = Character.toChars(codePoint);
// and to String, containing the character we want
String symbol = new String(charPair);

// we now have str with the desired character as the first item
// confirm that we indeed have character with code point 128149
System.out.println("First code point: " + symbol.codePointAt(0));

मैंने एक त्वरित परीक्षण भी किया कि कौन सी रूपांतरण पद्धति काम करती है और कौन सी नहीं

int codePoint = 128149;
char[] charPair = Character.toChars(codePoint);

String str = new String(charPair, 0, 2);
System.out.println("First code point: " + str.codePointAt(0));    // 128149, worked
String str2 = charPair.toString();
System.out.println("Second code point: " + str2.codePointAt(0));  // 91, didn't work
String str3 = new String(charPair);
System.out.println("Third code point: " + str3.codePointAt(0));   // 128149, worked
String str4 = String.valueOf(codePoint);
System.out.println("Fourth code point: " + str4.codePointAt(0));  // 49, didn't work
String str5 = new String(new int[] {codePoint}, 0, 1);
System.out.println("Fifth code point: " + str5.codePointAt(0));   // 128149, worked

कैसे यह एक लाइनर के रूप में काम नहीं करता है? new String(Character.toChars(121849));एक्लिप्स कंसोल में टूट जाता है, लेकिन तीन-लाइन संस्करण काम करता है।
नौमेनन

@ नोमैनन इस मुद्दे को पुन: पेश नहीं कर सकते, मेरे लिए समान रूप से ठीक काम करता है
eis

आगे जाने के लिए कुडोस। के लिए str4काम, नहीं होना चाहिए codeहोना codePointबजाय?
skomisa

6

याद रखें कि charएक अभिन्न प्रकार है, और इस तरह एक पूर्णांक मान दिया जा सकता है, साथ ही साथ एक चार निरंतर।

char c = 0x2202;//aka 8706 in decimal. \u codepoints are in hex.
String s = String.valueOf(c);

वह बस मुझे एक वर्ग बॉक्स दे रहा है, square। यह मुझे "∂" नहीं दे रहा है।
पॉल रीनर्स

3
ऐसा इसलिए है क्योंकि 2202 वह नहीं है जिसकी intआपको तलाश थी। आप 0x2202 की तलाश में थे। मेरी गलती। किसी भी स्थिति में, यदि आपके पास वह intकोड बिंदु है जिसकी आप तलाश कर रहे हैं, तो आप इसे केवल एक में डाल सकते हैं char, और इसका उपयोग कर सकते हैं ( Stringयदि आप चाहें तो निर्माण कर सकते हैं)।
ILMTitan

6

इसने मेरे लिए ठीक काम किया।

  String cc2 = "2202";
  String text2 = String.valueOf(Character.toChars(Integer.parseInt(cc2, 16)));

अब text2 में ∂ होगा।


4
String st="2202";
int cp=Integer.parseInt(st,16);// it convert st into hex number.
char c[]=Character.toChars(cp);
System.out.println(c);// its display the character corresponding to '\u2202'.

1
यद्यपि यह पोस्ट प्रश्न का उत्तर दे सकती है, लेकिन आप क्या कर रहे हैं, इसके लिए एक स्पष्टीकरण आवश्यक है; अपने उत्तर की गुणवत्ता और पठनीयता में सुधार करने के लिए
अजिल ओ।

1
धन्यवाद, यह वास्तव में मेरी मदद की! ठीक काम करता है और यहां अन्य समाधानों की तुलना में आसान है (वास्तव में, जावा लोग चीजों को ओवरक्लंप करना पसंद करते हैं)।
पारसकर

2

इसे आपको इसी तरह करना होगा:

int cc = 0x2202;
char ccc = (char) Integer.parseInt(String.valueOf(cc), 16);
final String text = String.valueOf(ccc);

इस समाधान Arne Vajhjj द्वारा है।


क्या आप यह काम कर रहे हैं? यदि ऐसा है, तो यह इसलिए काम करता है क्योंकि आप दो-हज़ार, दो-सौ और दो को 0x2202 के रूप में पुन: स्थापित कर रहे हैं, जो कि, निश्चित रूप से एक ही चीज़ नहीं है।
dty

4
ओह, नहीं, रुको! यूनिकोड मान (जावा स्रोत में \ u एस्केप अनुक्रम) हेक्स हैं! तो यह सही है। आपने सिर्फ यह कहकर सबको गुमराह किया int c = 2202, जो गलत है! इससे बेहतर उपाय यह कहना आसान है कि int c = 0x2202जो आपको एक स्ट्रिंग के माध्यम से जाने से बचाएगा, आदि
dty

3
+1 @ डर्टी: मध्य char ccc...रेखा के लिए कोई कॉल नहीं है । बस का उपयोग करें int cc = 0x2202;और फिरfinal String text=String.valueOf(cc);
एंड्रयू Coonce

2

हालाँकि यह एक पुराना सवाल है, जावा 11 में इसे करने का एक बहुत ही आसान तरीका है जो आज जारी किया गया था: आप Character.toString () का एक नया अधिभार उपयोग कर सकते हैं :

public static String toString​(int codePoint)

Returns a String object representing the specified character (Unicode code point). The result is a string of length 1 or 2, consisting solely of the specified codePoint.

Parameters:
codePoint - the codePoint to be converted

Returns:
the string representation of the specified codePoint

Throws:
IllegalArgumentException - if the specified codePoint is not a valid Unicode code point.

Since:
11

चूंकि यह विधि किसी भी यूनिकोड कोड बिंदु का समर्थन करती है, इसलिए रिटर्निंग स्ट्रिंग की लंबाई 1 आवश्यक नहीं है।

प्रश्न में दिए गए उदाहरण के लिए कोड आवश्यक है:

    int codePoint = '\u2202';
    String s = Character.toString(codePoint); // <<< Requires JDK 11 !!!
    System.out.println(s); // Prints ∂

यह दृष्टिकोण कई फायदे प्रदान करता है:

  • यह किसी भी यूनिकोड कोड बिंदु के बजाय केवल उन लोगों के लिए काम करता है जिन्हें एक का उपयोग करके नियंत्रित किया जा सकता है char
  • यह संक्षिप्त है, और यह समझना आसान है कि कोड क्या कर रहा है।
  • यह एक के बजाय एक स्ट्रिंग के रूप में मान लौटाता है char[], जो अक्सर आप चाहते हैं। यदि आप कोड बिंदु के रूप में लौटना चाहते हैं तो मैकडॉवेल द्वारा पोस्ट किया गया उत्तर उपयुक्त है char[]

इस पर कुछ अतिरिक्त स्पष्टीकरण के रूप में इस जवाब ने मुझे तुरंत स्पष्ट कर दिया कि कैसे कोडपॉइंट चर बनाने के लिए। यहाँ वाक्यविन्यास होना चाहिए: int codePoint = 0x2202;तब: String s = Character.toString(codePoint); // <<< Requires JDK 11 !!! या एक-लाइनर में: System.out.println(Character.toString(0x2202)); // Prints ∂ आशा है कि यह किसी और की मदद करता है JDK 11 की इस सुविधा का उपयोग करके
Loathian

1

नीचे दिया गया कोड जापानी में "होना" शब्द के लिए 4 यूनिकोड वर्ण (दशमलव द्वारा दर्शाया गया) लिखेगा। हाँ, जापानी में "होना" क्रिया के 4 वर्ण हैं! वर्णों का मान दशमलव में है और इसे स्ट्रिंग [] - उदाहरण के लिए विभाजन का उपयोग करते हुए पढ़ा गया है। यदि आपके पास ऑक्टल या हेक्स है, तो parseInt एक मूलांक भी लेते हैं।

// pseudo code
// 1. init the String[] containing the 4 unicodes in decima :: intsInStrs 
// 2. allocate the proper number of character pairs :: c2s
// 3. Using Integer.parseInt (... with radix or not) get the right int value
// 4. place it in the correct location of in the array of character pairs
// 5. convert c2s[] to String
// 6. print 

String[] intsInStrs = {"12354", "12426", "12414", "12377"}; // 1.
char [] c2s = new char [intsInStrs.length * 2];  // 2.  two chars per unicode

int ii = 0;
for (String intString : intsInStrs) {
    // 3. NB ii*2 because the 16 bit value of Unicode is written in 2 chars
    Character.toChars(Integer.parseInt(intsInStrs[ii]), c2s, ii * 2 ); // 3 + 4
    ++ii; // advance to the next char
}

String symbols = new String(c2s);  // 5.
System.out.println("\nLooooonger code point: " + symbols); // 6.
// I tested it in Eclipse and Java 7 and it works.  Enjoy

1

यहाँ एक यूनिकोड वर्णों के बीच प्रिंट करने के लिए एक ब्लॉक \u00c0है \u00ff:

char[] ca = {'\u00c0'};
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 16; j++) {
        String sc = new String(ca);
        System.out.print(sc + " ");
        ca[0]++;
    }
    System.out.println();
}

0

Unfortunatelly, पहली टिप्पणी (newbiedoodle) में वर्णित के रूप में एक प्रतिक्रिया को दूर करने के लिए अच्छे परिणाम के लिए नेतृत्व नहीं करते। अधिकांश (यदि सभी नहीं) IDE सिंटैक्स त्रुटि जारी करता है। इसका कारण यह है, कि जावा एस्केपेड यूनिकोड प्रारूप सिंटैक्स "\ uXXXX" की अपेक्षा करता है, जहां XXXX 4 हेक्साडेसिमल अंक हैं, जो अनिवार्य हैं। इस स्ट्रिंग को टुकड़ों से मोड़ने का प्रयास विफल रहता है। बेशक, "\ u" "\ u u" के समान नहीं है। पहला सिंटैक्स का मतलब 'यू' से बच जाता है, दूसरा साधन 'बैक' से बच जाता है (जिसके बाद बैकलैश होता है)। यह अजीब है, कि अपाचे पृष्ठों पर उपयोगिता प्रस्तुत की गई है, जो बिल्कुल इस व्यवहार को कर रही है। लेकिन वास्तव में, यह एस्केप मिमिक यूटिलिटी है । अपाचे की अपनी कुछ उपयोगिताएँ हैं (मैंने उन्हें परीक्षण नहीं किया), जो आपके लिए यह काम करते हैं। हो सकता है, यह अभी भी वह नहीं है, जो आप करना चाहते हैं।लेकिन इस उपयोगितासमाधान के लिए अच्छा तरीका है। ऊपर वर्णित संयोजन (MeraNaamJoker) के साथ। मेरा समाधान इस Escaped मिमिक स्ट्रिंग का निर्माण करता है और फिर इसे यूनिकोड में बदल देता है (वास्तविक एस्केपेड यूनिकोड प्रतिबंध से बचने के लिए)। मैंने इसका उपयोग पाठ की प्रतिलिपि बनाने के लिए किया है, इसलिए यह संभव है, कि uencode पद्धति में '\\ u' को छोड़कर '\\ u' का उपयोग करना बेहतर होगा। कोशिश करो।

  /**
   * Converts character to the mimic unicode format i.e. '\\u0020'.
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param ch  the character to convert
   * @return is in the mimic of escaped unicode string, 
   */
  public static String unicodeEscaped(char ch) {
    String returnStr;
    //String uniTemplate = "\u0000";
    final static String charEsc = "\\u";

    if (ch < 0x10) {
      returnStr = "000" + Integer.toHexString(ch);
    }
    else if (ch < 0x100) {
      returnStr = "00" + Integer.toHexString(ch);
    }
    else if (ch < 0x1000) {
      returnStr = "0" + Integer.toHexString(ch);
    }
    else
      returnStr = "" + Integer.toHexString(ch);

    return charEsc + returnStr;
  }

  /**
   * Converts the string from UTF8 to mimic unicode format i.e. '\\u0020'.
   * notice: i cannot use real unicode format, because this is immediately translated
   * to the character in time of compiling and editor (i.e. netbeans) checking it
   * instead reaal unicode format i.e. '\u0020' i using mimic unicode format '\\u0020'
   * as a string, but it doesn't gives the same results, of course
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param String - nationalString in the UTF8 string to convert
   * @return is the string in JAVA unicode mimic escaped
   */
  public String encodeStr(String nationalString) throws UnsupportedEncodingException {
    String convertedString = "";

    for (int i = 0; i < nationalString.length(); i++) {
      Character chs = nationalString.charAt(i);
      convertedString += unicodeEscaped(chs);
    }
    return convertedString;
  }

  /**
   * Converts the string from mimic unicode format i.e. '\\u0020' back to UTF8.
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param String - nationalString in the JAVA unicode mimic escaped
   * @return is the string in UTF8 string
   */
  public String uencodeStr(String escapedString) throws UnsupportedEncodingException {
    String convertedString = "";

    String[] arrStr = escapedString.split("\\\\u");
    String str, istr;
    for (int i = 1; i < arrStr.length; i++) {
      str = arrStr[i];
      if (!str.isEmpty()) {
        Integer iI = Integer.parseInt(str, 16);
        char[] chaCha = Character.toChars(iI);
        convertedString += String.valueOf(chaCha);
      }
    }
    return convertedString;
  }


-7

(ANSWER DOT NET 4.5 में है और जावा में, एक समान दृष्टिकोण मौजूद होना चाहिए)

मैं भारत में पश्चिम बंगाल से हूं। मैं समझता हूँ के रूप में आपकी समस्या है ... आप 'অ' के लिए इसी तरह का उत्पादन करना चाहते हैं जो यूनिकोड हेक्स है (यह बंगाली भाषा में एक पत्र है): 0X0985

अब यदि आप अपनी भाषा के संबंध में इस मूल्य को जानते हैं तो आप उस भाषा के विशिष्ट यूनिकोड प्रतीक को सही कैसे बनाएंगे?

डॉट नेट में यह इतना सरल है:

int c = 0X0985;
string x = Char.ConvertFromUtf32(c);

अब x तुम्हारा जवाब है। लेकिन यह एचईएक्स द्वारा एचईएक्स कन्वर्ट है और वाक्य रूपांतरण के लिए वाक्य शोधकर्ताओं के लिए एक काम है: पी


सवाल वास्तव में जावा के लिए है। मैं यह नहीं देखता कि .NET का उत्तर यहां से कैसे संबंधित है।
ईस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.