【问题标题】:How can I get a Unicode character's code?如何获得 Unicode 字符代码?
【发布时间】:2011-01-01 16:02:06
【问题描述】:

假设我有这个:

char registered = '®';

umlaut,或任何Unicode 字符。我怎样才能得到它的代码?

【问题讨论】:

    标签: java unicode character


    【解决方案1】:

    只需将其转换为int:

    char registered = '®';
    int code = (int) registered;
    

    事实上,存在从 charint 的隐式转换,因此您不必像我在上面所做的那样明确指定它,但在这种情况下我会这样做以明确您的身份努力去做。

    这将给出 UTF-16 代码单元 - 这与基本多语言平面中定义的任何字符的 Unicode 代码点相同。 (并且只有 BMP 字符可以在 Java 中表示为 char 值。)正如 Andrzej Doyle 的回答所说,如果您想要来自任意字符串的 Unicode 代码点,请使用 Character.codePointAt()

    一旦您获得了 UTF-16 代码单元或 Unicode 代码点,它们都是整数,您可以自行决定如何处理它们。如果你想要一个字符串表示,你需要确切地决定你想要什么样的 kind 表示。 (例如,如果您知道该值将始终在 BMP 中,您可能需要一个固定的 4 位十六进制表示,前缀为 U+,例如 "U+0020" 表示空格。)但这超出了这个问题的范围,因为我们不知道要求是什么。

    【讨论】:

    • @Geo:基本多语言平面中的任何内容,是的。您不能在 Java 中用单个字符表示 U+FFFF 以上的字符。但是 char 被有效地定义为 UTF-16 代码点。
    • 它适用于每个char,它代表U+FFFF 之下的一个Unicode 字符,但不适用于每个Unicode 字符,因为char 不能代表所有Unicode。根据您的char 的来源,您可能需要做一些更复杂的事情(并且真的应该为此做好准备)。
    • 要将其转换为十六进制,请使用Integer#toHexString()
    • 如果它在基本多语言平面之外怎么办?
    • @fzzfzzfzz:那你根本不用一个char开头,但是你可以用char.Convert.ToUtf32
    【解决方案2】:

    一种更完整但更冗长的方法是使用Character.codePointAt 方法。这将处理“高代理”字符,这些字符不能由 char 可以表示的范围内的单个整数表示。

    在您给出的示例中,这不是绝对必要的 - 如果(Unicode)字符可以放入单个(Java)char(例如 registered 局部变量),那么它必须在 @ 987654326@ 到 \uffff 范围,您无需担心代理对。但是,如果您正在查看可能更高的代码点,来自 String/char 数组,那么调用此方法是明智的,以覆盖边缘情况。

    例如,而不是

    String input = ...;
    char fifthChar = input.charAt(4);
    int codePoint = (int)fifthChar;
    

    使用

    String input = ...;
    int codePoint = Character.codePointAt(input, 4);
    

    在这种情况下,这不仅代码略少,而且会为您处理代理对的检测。

    【讨论】:

    【解决方案3】:

    在 Java 中,char 在技术上是一个“16 位整数”,因此您只需将其转换为 int 即可获得它的代码。 来自Oracle

    char 数据类型是单个 16 位 Unicode 字符。它有一个 '\u0000' 的最小值(或 0)和 '\uffff' 的最大值(或 65,535(含)。

    所以你可以简单地将它转换为 int。

    char registered = '®';
    System.out.println(String.format("This is an int-code: %d", (int) registered));
    System.out.println(String.format("And this is an hexa code: %x", (int) registered));
    

    【讨论】:

    • 它甚至适用于欧元字符String.format("%x", (int) '€') == 0x20ac == '\u20ac'
    【解决方案4】:

    对我来说,只有“Integer.toHexString(registered)”按我想要的方式工作:

    char registered = '®';
    System.out.println("Answer:"+Integer.toHexString(registered));
    

    此答案只会为您提供表格中通常显示的字符串表示形式。 Jon Skeet 的回答解释了更多。

    【讨论】:

    • 正如我的回答中的 cmets 所述,这是因为“您想要的方式”是生成代码的十六进制表示 - 这不是这个问题所要求的。代码本身是一个整数; “如何创建整数的十六进制表示”是另一回事。 (对于 Unicode 代码点,您还应该考虑需要多少个十六进制数字 - 例如,您可能希望将 4 用于 BMP 字符,将 6 用于其他字符,或者始终使用 6,或者始终使用偶数......)跨度>
    • 它说明了你写的内容。是什么让你认为代码根据定义是整数?对我来说,代码是符号的组合,不一定是数字或整数。您的回答确实很有用,但最后我花了半个小时找到了我所理解的获取代码的方法,也许它可以为其他用户节省一些空闲时间。
    • Unicode 就是这样定义它的。来自unicode.org/standard/principles.html:“Unicode 标准定义的每个代码元素都分配了一个数字。每个数字都称为代码点,当在文本中引用时,以前缀“U+”后的十六进制形式列出。例如,代码点 U+0041 是十六进制数 0041(等于十进制数 65)。它代表 Unicode 标准中的字符“A”。我已经编辑了我的答案,以明确为什么“字符'X'的代码是什么”的答案是一个数字,而不是一个字符串。
    【解决方案5】:

    有一个开源库 MgntUtils,它有一个实用程序类 StringUnicodeEncoderDecoder。该类提供将任何 String 转换为 Unicode 序列的静态方法,反之亦然。非常简单实用。要转换字符串,您只需:

    String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);
    

    例如一个字符串“Hello World”将被转换成

    "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

    它适用于任何语言。这是解释有关图书馆的所有细节的文章的链接:MgntUtils。寻找副标题“字符串 Unicode 转换器”。该库可以通过Maven artifact 获取或从Github 获取(包括源代码和Javadoc)

    【讨论】:

      【解决方案6】:

      亲爱的朋友,Jon Skeet 说你可以找到字符十进制代码但它不是字符十六进制代码,因为它应该在 unicode 中提到,所以你应该通过 HexCode 而不是在 Deciaml 中表示字符代码。

      http://unicode.codeplex.com 有一个开源工具,可提供有关字符或句子的完整信息。

      所以最好创建一个解析器,将 char 作为参数并将 ahexCode 作为字符串返回

      public static String GetHexCode(char character)
          {
              return String.format("{0:X4}", GetDecimal(character));
          }//end
      

      希望对你有帮助

      【讨论】:

      • “所以你应该通过 HexCode 而不是 Deciaml 来表示字符代码”——它是一个数字。十六进制与十进制仅在将其转换为字符串时起作用,并且在问题中根本没有要求。
      • 您认为发布 C# 链接以及一些 C# 代码如何帮助操作员解决 Java 问题?
      【解决方案7】:

      //下面可以获取unicode

      int a = 'a'; // 'a' 是你想要获取其 unicode 的字母或符号

      //你可以通过它的unicode获取下面的符号或字母

      System.out.println("\123"); //123是你要传输的unicode

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2013-10-17
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        相关资源
        最近更新 更多