【问题标题】:Java - Converting from unicode to a string?Java - 从 unicode 转换为字符串?
【发布时间】:2016-03-26 18:59:44
【问题描述】:

我可以轻松创建一个 unicode 字符并使用以下代码行打印它

String uniChar = Character.toString((char)0000);
System.out.println(uniChar);

但是,现在我想检索上面的数字,加 3,然后打印出数字 0003 对应的新 unicode 字符。有没有办法让我检索 unichar 的 ACTUAL 字符串?如“\u0000”?这样我就可以只对“0000”进行子串化,将其转换为 int,加 3,然后反转整个过程。

【问题讨论】:

    标签: java string unicode character


    【解决方案1】:

    我想你在找String#codePointAt

    返回指定索引处的字符(Unicode 代码点)。索引指的是 char 值(Unicode 代码单元),范围从 0 到 length()-1。

    如果给定索引处指定的char值在高代理范围内,后面的索引小于这个String的长度,并且后面索引处的char值在低代理范围内,那么返回与此代理对对应的补充代码点。否则,返回给定索引处的 char 值。

    例如(live copy):

    // String containing smiling face with smiling eyes emoji
    String str = "?";
    // Get the code point
    int cp = str.codePointAt(0);
    // Show it
    System.out.println(str + ", code point = U+" + toHex(cp));
    // Increase it
    ++cp;
    // Get the updated string (from an array of code points)
    String updated = new String(new int[] { cp }, 0, 1);
    // Show it
    System.out.println(updated + ", code point = U+" + toHex(cp));
    

    toHex 只是return Integer.toString(n, 16).toUpperCase();

    输出:

    ?, 代码点 = U+1F60A
    ?,代码点 = U+1F60B

    【讨论】:

    • 完美,这正是我想要的。谢谢!
    • @user07 - 不,answer (String.codePointAt) 适用于需要两个代码单元的代码点(迂腐,在 Java 中没有“1 字节”字符串中的代码点——Java 字符串 [本质上] 使用 UTF-16)。答案中的 example 使用了一个代码单元代码点,但这只是一个示例。我添加了一个带有两个代码单元代码点的示例。
    • @user07 - 啊!我明白你的意思了。我已更新以显示在访问代码点后从代码点数组创建字符串。谢谢!
    【解决方案2】:

    Unicode 是“字符”的编号 - 代码点 - 最多为 3 字节 int 范围。

    UTF-16编码使用字节对的序列,java char就是这样的字节对。 char 的(int) 转换是不完美的,并且仅涵盖了 Unicode 的一部分。将代码点转换为可能多个字符的正确方法:

    int codePoint = 0x263B;
    char[] chars = Character.chars(codePoint);
    

    要使用 Unicode 代码点,可以这样做:

    int[] codePoints = {0x2639, 0x263a, 0x263b};
    String s = new String(codePoints, 0, codePoints.length);
    codePoints[0} += 2;
    

    您的代码使用 1 个代码点的 int 数组。

    在 java 8 中可以得到一个 IntStream 的代码点:

    s.codePoints().forEach(cp -> {
        System.out.printf("U+%X = %s%n", cp, Character.getName(cp));
    };
    

    【讨论】:

      【解决方案3】:

      此代码适用于 Unicode BMP 和 Unicode 补充窗格(使用 UTF-8 中的 4 个字节对字符进行编码)的代码点。 4 字节代码点需要存储 2 个 Java 字符实体,因此在这种情况下 string.length() = 2。

      // array will contain one or two characters
      char[] chars = Character.toChars(codePoint);
      
      // string.length will be 1 or 2
      String str = new String(chars);
      

      【讨论】:

      • 这并没有显示问题的基本方面:如何访问字符串中字符的代码点。
      • 它回答了问题的标题。我只是因为标题而来到这个页面,我没有找到对我有帮助的答案。所以你来了。
      • title != 问题。我恭敬地建议要么回答实际问题,要么删除答案。不回答问题的答案是没有用的,因此随着时间的推移,它们会累积反对票。
      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2022-07-21
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2016-11-03
      相关资源
      最近更新 更多