从其编号创建Unicode字符

时间:2011-04-07 18:40:45

标签: java string unicode character

我想在Java中显示Unicode字符。如果我这样做,它就可以正常工作:

String symbol = "\u2202";

符号等于“∂”。这就是我想要的。

问题是我知道Unicode编号,需要从中创建Unicode符号。我试过(对我而言)显而易见的事情:

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

但是,在这种情况下,符号等于“\ u2202”。那不是我想要的。

如果我知道它的Unicode编号,我该如何构造符号(但仅在运行时---我不能像第一个例子那样硬编码)?

13 个答案:

答案 0 :(得分:117)

如果您希望将UTF-16编码的代码单元作为char,您可以解析整数并将其转换为其他人建议的。

如果您想支持所有代码点,请使用Character.toChars(int)。这将处理代码点不能适合单个char值的情况。

Doc说:

  

将指定的字符(Unicode代码点)转换为存储在char数组中的UTF-16表示形式。如果指定的代码点是BMP(基本多语言平面或平面0)值,则生成的char数组与codePoint具有相同的值。如果指定的代码点是补充代码点,则生成的char数组具有相应的代理对。

答案 1 :(得分:62)

只需将int投放到char即可。您可以使用String将其转换为Character.toString()

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

编辑:

请记住Java源代码中的转义序列(\u位)是HEX,因此如果您尝试重现转义序列,则需要int c = 0x2202之类的内容。

答案 2 :(得分:18)

这里的其他答案或者只支持unicode到U + FFFF(只处理一个char实例的答案)或者不告诉如何获得实际符号(答案停在Character.toChars()或之后使用不正确的方法,所以也在这里添加我的答案。

为了支持补充代码点,这是需要做的事情:

// 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(code);
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

答案 3 :(得分:5)

请记住char是一个整数类型,因此可以给出一个整数值,以及一个char常量。

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

答案 4 :(得分:5)

这个对我来说很好。

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

现在text2将有∂。

答案 5 :(得分:2)

您就是这样做的:

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

This solution来自ArneVajhøj。

答案 6 :(得分:2)

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'.

答案 7 :(得分:1)

下面的代码将为日语中的单词“be”写下4个unicode字符(用小数表示)。是的,日语中的动词“be”有4个字符! 字符的值以十进制表示,并且已经读入String []数组 - 例如使用split。如果您有八进制或十六进制,try/except也会使用基数。

// 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

答案 8 :(得分:1)

尽管这是一个老问题,但是在今天发布的Java 11中,有一个非常简单的方法可以做到这一点:您可以使用a new overload of 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

由于此方法支持任何Unicode代码点,所以返回的String的长度不必为1。

问题中给出的示例所需的代码很简单:

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

这种方法具有以下优点:

  • 它适用于任何Unicode代码点,而不仅仅适用于可以使用char处理的代码点。
  • 简洁明了,很容易理解代码在做什么。
  • 它以字符串形式而不是通常要的char[]形式返回值。如果您希望代码点返回为char[],则The answer posted by McDowell是合适的。

答案 9 :(得分:0)

不幸的是,要消除第一条评论(newbiedoodle)中提到的一个强烈反应,不会带来好结果。大多数(如果不是全部)IDE发出语法错误。原因在于,Java Escaped Unicode格式需要语法“\ uXXXX”,其中XXXX是4个十六进制数字,这是必需的。尝试从片段中折叠此字符串失败。当然,“\ u”与“\\ u”不同。第一种语法意味着转义'u',第二种语法意味着转义反弹(反弹),然后是'u'。奇怪的是,在Apache页面上提供了实用程序,它正是这样做的。但实际上,它是Escape mimic utility。 Apache有一些自己的实用程序(我没有测试它们),这对你有用。也许,它仍然不是那样,你想拥有什么。 Apache Escape Unicode utilities但是这个实用程序1对解决方案有很好的解决方法。结合上述组合(MeraNaamJoker)。我的解决方案是创建此Escaped模仿字符串,然后将其转换回unicode(以避免真正的Escaped Unicode限制)。我用它来复制文本,所以有可能在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;
  }

答案 10 :(得分:-1)

char c =(char)0x2202; String s =&#34;&#34; + c;

答案 11 :(得分:-1)

以下是在\u00c0\u00ff之间打印unicode字符的块:

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();
}

答案 12 :(得分:-6)

(答案是在Dots NET 4.5和java中,必须存在类似的方法)

我来自印度的西孟加拉邦。 据我了解你的问题是...... 你想要产生类似'অ'(这是孟加拉语的一封信) 它具有Unicode HEX:0X0985

现在,如果您知道有关您的语言的这个值,那么您将如何生成该语言特定的Unicode符号呢?

在Dot Net中,它就像这样简单:

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

现在x是你的答案。 但这是HEX by HEX convert和句子到句子转换是研究人员的工作:P