【问题标题】:Print string literal unicode as the actual character将字符串文字 unicode 打印为实际字符
【发布时间】:2010-11-27 00:51:21
【问题描述】:

在我的 Java 应用程序中,我传入了一个如下所示的字符串:

“\u00a5123”

将该字符串打印到控制台时,我得到与输出相同的字符串(如预期的那样)。

但是,我想通过将 unicode 转换为实际的日元符号(\u00a5 -> 日元符号)来打印出来——我该怎么做呢?

即所以它看起来像这样:“[日元符号]123”

【问题讨论】:

  • 那么,为了更好地了解问题空间,有没有办法获得正确的 unicode 字符串?这是使用什么上下文?时间/速度是一个重要的考虑因素吗?
  • 另外,是否有任何简化的假设?即这是唯一一次“\u####”会发生吗?因为那时你可以使用正则表达式来提取数字。
  • 这在通过 groovy 运行 java 程序时是必需的,它对 $ 的解释不同。所以我使用System.out.println("\u0024");

标签: java unicode


【解决方案1】:

可以用这个代替上面的:

System.out.println((char)0x63A5);

这里是打印所有框构建 unicode 字符的代码。

public static void printBox()
{
    for (int i=0x2500;i<=0x257F;i++)
    {
        System.out.printf("0x%x : %c\n",i,(char)i);
    }
}

【讨论】:

    【解决方案2】:

    如前所述,必须解析这些字符串才能获得所需的结果。

    1. 使用 \u 作为分隔符对字符串进行标记。例如:\u63A5\u53D7 =&gt; { "63A5", "53D7" }

    2. 按如下方式处理这些字符串:

      String hex = "63A5";
      int intValue = Integer.parseInt(hex, 16);
      System.out.println((char)intValue);
      

    【讨论】:

      【解决方案3】:

      您可能必须为这些编写一个解析,除非您可以在第三方库中找到一个。 JDK 中没有任何内容可以为您解析这些,我知道是因为我最近有了一个想法,即使用这些转义符作为通过纯拉丁语 1 数据库走私 unicode 的一种方式。 (顺便说一句,我最终做了其他事情)

      我会告诉你,java.util.Properties 在读取和写入文件时会以这种方式转义和取消转义 Unicode 字符(因为文件必须是 ASCII)。它为此使用的方法是私有的,因此您不能调用它们,但您可以使用 JDK 源代码来激发您的解决方案。

      【讨论】:

      • 有点复杂,但您可以将字符串作为值发送到内存中的属性文件,然后使用Properties 类读取它。
      【解决方案4】:

      我写了一个小程序:

      public static void main(String[] args) {
          System.out.println("\u00a5123");
      }
      

      它的输出:

      ¥123

      即它准确地输出了您在帖子中所说的内容。我不确定有没有其他事情发生。您使用的是什么版本的 Java?

      编辑:

      根据您的说明,有几种不同的技术。最直接的方法是查找后跟 4 个十六进制代码字符的“\u”,提取该部分并用十六进制代码替换为 unicode 版本(使用 Character 类)。这当然假设字符串前面没有 \u。

      我不知道有任何特定系统可以将字符串解析为编码的 Java 字符串。

      【讨论】:

      • 你说直接打印字符串会给你正确的输出是正确的。然而,有人给了我一个基本上被转义的字符串。因此,假设您的 main 方法仍然存在,但您调用了一个名为 foo 的方法,如下所示: foo("\\u00a5123");
      • 反斜杠转义是只有 Java 编译器需要处理的事情,而不是 JVM 或 API。因此,在运行时没有简单的方法来解析此类字符串也就不足为奇了。
      • @Todd 同意 - 关于我唯一能想到的另一件事是尝试以某种方式使用编译器 - 但这对我来说听起来很麻烦。
      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 2019-04-26
      • 2020-01-21
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      相关资源
      最近更新 更多