在Java中获取字符值

16

如何在Java中获取字符的UTF8代码? 我有字符'a',我想要值97。 我有字符'é',我想要值233。

这里是一个表格,更多的值

我尝试使用Character.getNumericValue(a),但对于'a',它给我返回10而不是97,有什么想法吗?

这似乎非常基础,但任何帮助都将不胜感激!


8个回答

15

char 实际上是一个包含字符 Unicode 值的数字类型(确切地说,是 UTF-16,表示 BMP 之外的字符需要 两个 char)。你可以像使用 int 一样使用它。

Character.getNumericValue() 尝试将字符解释为数字。


11

你可以使用java.lang.String的codePointAt(int index)方法来实现。这里有个例子:

"a".codePointAt(0) --> 97
"é".codePointAt(0) --> 233

如果您想避免不必要地创建字符串,以下方法同样适用于字符数组:

Character.codePointAt(new char[] {'a'},0)

我最终来到这里,因为我无法相信没有名为codePoint的方法可以接受单个字符:Character.codePoint('a')或非静态方法c.codePoint()。 - user1708042

6
那些“UTF-8”代码实际上并不是UTF-8编码,它们只是Unicode值,就像Unicode代码表中所示的一样。
因此,'é'实际上是U+00E9——在UTF-8中,它将由两个字节{0xc3, 0xa9}表示。
现在,要获取Unicode值(或更精确地说,是UTF-16值,因为Java在内部使用它),您只需要将该值转换为整数即可:
char c = '\u00e9'; // c is now e-acute
int i = c; // i is now 233

4

这会产生良好的结果:

int a = 'a';
System.out.println(a); // outputs 97

同样地:
System.out.println((int)'é');

输出233

请注意,第一个示例仅适用于标准和扩展ASCII字符集中包含的字符。第二个示例适用于所有Unicode字符。您可以通过将char乘以1来实现相同的结果。 System.out.println( 1 * 'é');


1
你可以创建一个简单的循环来列出所有可用的UTF-8字符,像这样:
public class UTF8Characters {
    public static void main(String[] args) {
        for (int i = 12; i <= 999; i++) {
            System.out.println(i +" - "+ (char)i);
        }
    }
}

1

你的问题不够清晰。你是想要一个特定字符的Unicode代码点(就像你给出的例子),还是想要将Unicode代码点转换为UTF-8字节序列?

如果是前者,我建议查看http://www.unicode.org/上的代码图表。

如果是后者,那么以下程序可以实现:

public class Foo
{
   public static void main(String[] argv)
   throws Exception
   {
      char c = '\u00E9';
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      OutputStreamWriter out = new OutputStreamWriter(bos, "UTF-8");
      out.write(c);
      out.flush();
      byte[] bytes = bos.toByteArray();
      for (int ii = 0 ; ii < bytes.length ; ii++)
         System.out.println(bytes[ii] & 0xFF);
   }
}

(还有一个在线Unicode转UTF8的页面,但我在这台机器上没有URL)


1
我的做法大致如下:

My method to do it is something like this:

char c = 'c';
int i = Character.codePointAt(String.valueOf(c), 0);
// testing
System.out.println(String.format("%c -> %d", c, i)); // c -> 99

0

有一个开源库MgntUtils,其中包含一个Utility类StringUnicodeEncoderDecoder。该类提供了将任何字符串转换为Unicode序列及其反向操作的静态方法。非常简单和实用。要转换字符串,只需执行以下操作:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);

例如,一个字符串 "Hello World" 将被转换为
"\u0048\u0065\u006c\u006c\u006f\u0020 \u0057\u006f\u0072\u006c\u0064"
它适用于任何语言。这是解释该库的所有细节的文章链接:MgntUtils。查找子标题“字符串Unicode转换器”。该文章会提供给你从Maven Central获取工件和从Github获取项目本身的链接。该库附带撰写良好的Javadoc和源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接