2010-01-22 42 views
2

我试图从utf代码中创建char字符。我正在从一个文字中读取这个代码,这个文件是一个字符映射。所有字符都由其UTF代码指定。从包含utf代码的字符串中创建char字符

0020 SPACE
0021感叹号
0022引号



从文件中读取代码后,我最终得到了一个字符串中的代码。我如何将此代码(Stirng)转换为char?

+0

我不明白这个问题。你有“0020”,并想要相应的字符,就是这样吗? – 2010-01-22 22:17:42

+0

是的,就是这样。 – Omar 2010-01-22 22:21:42

回答

4

的代码存储在十六进制,所以我想你想的:

String code = "0021"; 
char c = (char)Integer.parseInt(code, 16); 
System.out.println("Code: " + code + " Character: " + c); 

我认为没有你的字符代码超过可以存储在一个字符,即字符的Basic Multilingual Plane最大值。由于您的数据格式显示为填充为零的最大长度为4个十六进制数字,因此我假定您需要考虑的所有字符实际上都是在BMP中。

如果不是这样,您将需要一个不同的解决方案。见Character.toChars(int)

+0

我已经试过了。但是,一旦你得到像000A Integer.parseInt失败的代码。 – Omar 2010-01-22 22:24:51

+2

你还记得16吗?它意味着将数字视为十六进制。如果你省略这个参数,它将不起作用。 – 2010-01-22 22:25:46

+0

我的不好,我没有意识到十六进制的部分。 – Omar 2010-01-22 22:25:54

1

使用Integer.parseInt(String, 16)将其解析为整数,然后将其转换为char。

0

它看起来像UTF-16。要从这些字节创建字符串,请使用:

new String(byte[]{0x00, 0x21}, "UTF-16") 

这会创建一个包含感叹号的字符串。该字符是charAt(0)。

编辑

可能不是最高效的方法,但它适用于其他的编码,以及...

编辑

OK,有一个误解,上面的代码不是一个解决方案,而是一个关于如何促进String构造函数从特殊编码中的一系列字节创建String的例子。正如它是一个例子,它看起来是静态的。这里是运行时的解决方案(知道尤其是接受的解决方案更适合 - 这一个更一般):

public char decodeUTF16(byte b1, byte b2) { 
    return decode(new byte[]{b1, b2}).charAt(0); 
} 

public String decodeUTF16(byte[] bytes) { 
    return decode(bytes, "UTF-16"); 
} 

public String decode(byte[] bytes, String encoding) { 
    return new String(bytes, encoding); 
} 
+0

downvote的任何理由? – 2010-01-22 22:47:39

+0

@Andreas_D:因为OP希望有一个运行时解决方案,因此您需要编译时间,并提及并滥用UTF-16。 OP通过ParseInt()函数将其解码为int后,它已经具有十六进制的Unicode字符点),它们不需要UTF-16解码。 'char c =(char)0x0020'另一方面将是一个宝贵的贡献,我会建议编辑它。 – 2010-01-22 22:55:19

+0

这是一个例子。只是一个例子。 – 2010-01-22 23:06:15