2009-09-10 105 views
13

在我的Java应用程序,我已经在一个字符串被通过,看起来像这样:打印字符串字面Unicode作为实际字符

“\ u00a5123”

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

但是,我想通过将unicode转换为实际的日元符号(\ u00a5 - >日元符号)来打印出来 - 我该如何去做这件事?

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

+0

因此,为了更好地了解问题空间,有没有办法得到一个合适的Unicode字符串?这是用什么语境?时间/速度是一个重要的考虑因素? – aperkins 2009-09-10 01:12:08

+0

另外,有没有简化的假设?即这是“\ u ####”会发生的唯一时间吗?因为那么你可以使用正则表达式来提取数字。 – aperkins 2009-09-10 01:14:08

+0

可能的重复[如何在Java中忽略Java字符串](http://stackoverflow.com/questions/3537706/howto-unescape-a-java-string-literal-in-java) – 2015-01-13 16:06:47

回答

15

我写了一个小程序:

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

它的输出:

¥123

即它输出完全符合你在帖子中陈述的内容。我不确定没有其他事情在发生。你使用的是什么版本的Java?

编辑:

为了回应您的澄清,有几种不同的技术。最直接的方法是查找一个“\ u”后跟4个十六进制代码字符,将其提取出来并用十六进制代码替换为unicode版本(使用Character类)。这当然假定字符串在它前面不会有\ u。

我不知道任何特定的系统来解析字符串,就好像它是一个编码的Java字符串。

+0

你说的直接打印字符串会给你正确的输出是正确的。但是,有人向我传递了一个本质上已逃脱的字符串。所以让我们假设你的main方法仍然存在,但是你调用了一个名为foo的方法,如下所示:foo(“\\ u00a5123”); < - 注意字符串的转义 - 所以本质上我在foo方法里面得到的参数是我正在处理的字符串 – digiarnie 2009-09-10 00:58:47

+0

反斜杠转义是只有Java编译器需要处理的东西,而不是JVM或API。因此,发现在运行时解析这些字符串并不容易。 – 2009-09-10 01:44:49

+0

@Todd同意 - 关于我唯一能想到的其他事情是试图以某种方式使用编译器 - 但这对我来说听起来很麻烦。 – aperkins 2009-09-10 01:58:51

1

你可能不得不为这些写一个解析,除非你可以在第三方库中找到一个解析。 JDK没有任何东西可以为你解析这些信息,我知道,因为我最近有一个想法是使用这种类型的转义来作为通过仅用Latin-1的数据库来走私unicode的方式。 (我结束了做别的任何btw)

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

+0

有点令人费解,但是您可以将字符串作为值发送到内存中的属性文件,然后使用“属性”类读取它。 – McDowell 2009-09-10 08:59:56

2

如前所述,这些字符串将不得不被解析以获得所需的结果。

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

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

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

可以与此替换上面的:

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); 
    } 
}