从其编号创建Unicode字符

Pau*_*ers 107 java string unicode character

我想在Java中显示Unicode字符.如果我这样做,它的工作正常:

String symbol = "\u2202";

符号等于"∂".这就是我想要的.

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

int c = 2202;
String symbol =  "\\u" + c;
Run Code Online (Sandbox Code Playgroud)

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

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

McD*_*ell 122

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

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

Doc说:

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

  • 这个答案比接受的答案更正确. (14认同)
  • 首先,谢谢!在Scala中,我仍然无法解析大于char的字符。```scala>“ ‍” .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`。缺少最高位。我可以使用按位或(/sf/answers/155433351/)进行添加,但不知道如何确定已解析的字符已被截断。谢谢! (2认同)

dty*_*dty 67

只是把你int扔到一个char.您可以将其转换为String使用Character.toString():

String s = Character.toString((char)c);
Run Code Online (Sandbox Code Playgroud)

编辑:

请记住,Java源代码中的转义序列(\u位)是HEX,所以如果你试图重现转义序列,你需要类似的东西int c = 0x2202.

  • 威尔罗宾逊,危险!不要忘记Unicode代码点*不一定适合char*.因此,您需要提前确定`c`的值小于0x10000,否则这种方法将会非常糟糕. (17认同)
  • 这就是为什么我说'下面'!我需要强调的是,尽管Java字符只能达到0xffff,但Unicode代码点最多可达0xfffff.Java设计后,Unicode标准发生了变化.这些天来,Java字符技术上保留了UTF-16字,而不是Unicode代码点,并且当您的应用程序遇到异国情调的脚本时,忘记这会导致可怕的破坏. (10认同)
  • @DavidGiven感谢`Java字符值达到0xFFFF`.我不知道. (3认同)
  • 那只是给我一个方盒,࢚。不是给我“∂”。 (2认同)

eis*_*eis 19

这里的其他答案要么只支持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));
Run Code Online (Sandbox Code Playgroud)

我还快速测试了哪些转换方法有效,哪些无效

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
Run Code Online (Sandbox Code Playgroud)


ILM*_*tan 6

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

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

  • 那是因为2202不是你想要的`int`.你在找0x2202.我的错.在任何情况下,如果你有你正在寻找的代码点的`int`,你可以将它转换为`char`,然后使用它(如果你愿意,可以构造一个`String`). (3认同)

小智 6

这个对我很好.

  String cc2 = "2202";
  String text2 = String.valueOf(Character.toChars(Integer.parseInt(cc2, 16)));
Run Code Online (Sandbox Code Playgroud)

现在text2将有∂.


小智 6

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'.
Run Code Online (Sandbox Code Playgroud)