web-dev-qa-db-ja.com

番号からUnicode文字を作成する

JavaでUnicode文字を表示したい。これを行うと、それはうまく動作します:

String symbol = "\u2202";

シンボルは「∂」に等しい。それが私が欲しいものです。

問題は、Unicode番号を知っていて、そこからUnicodeシンボルを作成する必要があることです。私は(私にとって)明白なことを試しました:

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

ただし、この場合、シンボルは「\ u2202」に等しくなります。それは私が望むものではありません。

ユニコード番号がわかっている場合、シンボルを作成するにはどうすればよいですか(ただし、実行時のみです。最初の例のようにハードコーディングできません)。

98
Paul Reiners

intcharにキャストするだけです。 Character.toString()を使用して、それをStringに変換できます。

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

編集:

Javaソースコード(\uビット)のエスケープシーケンスはHEXであるため、エスケープシーケンスを再現しようとする場合は、int c = 0x2202のようなものが必要です。

64
dty

UTF-16でエンコードされたコードユニットをcharとして取得する場合は、整数を解析し、他の人が示唆するように整数にキャストできます。

すべてのコードポイントをサポートする場合は、 Character.toChars(int) を使用します。これは、コードポイントが単一のchar値に収まらない場合を処理します。

Docのコメント:

指定された文字(Unicodeコードポイント)を、char配列に格納されているUTF-16表現に変換します。指定されたコードポイントがBMP(Basic Multilingual PlaneまたはPlane 0)値の場合、結果のchar配列はcodePointと同じ値になります。指定されたコードポイントが補助コードポイントである場合、結果のchar配列には対応するサロゲートペアが含まれます。

120
McDowell

ここの他の回答は、U + FFFFまでのユニコード(charの1つのインスタンスのみを扱う回答)のみをサポートするか、実際のシンボルに到達する方法を教えない(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
19
eis

これは私のためにうまくいった。

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

これで、text2にはhaveが付きます。

5
MeraNaamJoker

charは整数型であるため、整数値とchar定数を指定できることに注意してください。

char c = 0x2202;//aka 8706 in decimal. \u codepoints are in hex.
String s = String.valueOf(c);
5
ILMTitan
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'.
3

これは古い質問ですが、本日リリースされたJava 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

このメソッドはすべてのUnicodeコードポイントをサポートしているため、返される文字列の長さは必ずしも1ではありません。

質問で与えられた例に必要なコードは単純です:

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

このアプローチにはいくつかの利点があります。

  • charを使用して処理できるものだけでなく、あらゆるUnicodeコードポイントに対して機能します。
  • 簡潔で、コードが何をしているのかを簡単に理解できます。
  • これは、値をchar[]ではなく文字列として返します。これは多くの場合必要なものです。 McDowellが投稿した回答 は、コードポイントをchar[]として返したい場合に適しています。
2
skomisa

これがあなたのやり方です:

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

このソリューション はArneVajhøjによるものです。

2
Paul Reiners

以下のコードは、日本語の「be」という単語に対して4つのUnicode文字(小数で表される)を書き込みます。はい、日本語の動詞「be」は4文字です。文字の値は10進数であり、たとえばsplitを使用してString []の配列に読み込まれています。 OctalまたはHexがある場合、 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
user96265

以下は、\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();
}
1
fjiang_ca

残念ながら、最初のコメント(newbiedoodle)で述べたように1つのバックラッシュを削除しても、良い結果にはなりません。ほとんどの(すべてではないにしても)IDEは構文エラーを発行します。その理由は、JavaエスケープされたUnicode形式は構文「\ uXXXX」を想定しているためです。XXXXは4桁の16進数で、必須です。この文字列を断片から折り畳もうとすると失敗します。もちろん、「\ u」は「\\ u」と同じではありません。最初の構文はエスケープされた 'u'を意味し、2番目はエスケープされたバックラッシ(バックラッシ)に続いて 'u'を意味します。奇妙なことに、Apacheページにユーティリティが表示され、まさにこの動作を実行します。しかし、実際には エスケープ模倣ユーティリティ です。 Apacheにはいくつかの独自のユーティリティがあります(私はそれらをテストしませんでした)。たぶん、それはあなたが欲しいものではありません。 Apache Escape Unicodeユーティリティ しかし、このユーティリティ 1 は解決策に優れたアプローチを持っています。上記の組み合わせ(MeraNaamJoker)。私の解決策は、このエスケープされた模倣文字列を作成し、それをユニコードに変換し直すことです(実際のエスケープされた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;
  }
0
hariprasad