java中的类型转换问题(ascii值为char)

时间:2014-06-26 13:25:44

标签: java casting

当我尝试将一些ASCII值转换为char时,我遇到了问题。

例如:

(char)145 //returns ? 
(char)129 //also returns ?

但它应该返回一个不同的角色。它也适用于许多其他值。

我希望我已经足够清楚。

3 个答案:

答案 0 :(得分:1)

ASCII是一种7位编码系统。有些程序甚至使用它来检测文件是二进制文件还是文本文件。 32以下的字符是转义字符,用作指令(例如新行,打印命令)

然而,该计划仍然有效。字符简单地存储为短(因此为16位)。但是该范围内的值没有解释。这意味着两个值的文本输出将不会产生任何结果。另一方面,(char) 145 == (char) 129之类的比较仍然有效(返回false)。仅仅因为对于处理器而言,短语和字符之间没有区别。


如果您有兴趣转换您的值,使得只有最低的七位数(这会修改该值使其处于有效范围内),您可以使用屏蔽:

int value = 145;
value &= 0x7f;
char c = (char) value;

答案 1 :(得分:0)

char类型是Unicode 16位,UTF-16。所以你可以{c-with-circumflex} (char) 265。 ASCII是7位0 - 127。

String s = "" + ((char)145) + ((char)129);

以上是两个Unicode字符的字符串(每个2字节,UTF-16)。

byte[] bytes = s.getBytes(StandardCharsets.US_ASCII); // ASCII with '?' as 7bit
s = new String(bytes, StandardCharsets.US_ASCII); // "??"

byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1); // ISO-8859-1 with Latin1

byte[] bytes = s.getBytes("Windows-1252"); // With Windows Latin1

byte[] bytes = s.getBytes(StandardCharsets.UTF_8); // No information loss.
s = new String(bytes, StandardCharsets.UTF_9); // Orinal string.

在java String/char/Reader/Writer处理文本(在Unicode中),而byte[]/InputStream/OutputStream处理二进制数据,字节。

对于字节,必须始终与编码相关联以提供文本。

答案:一旦从文本转换为某些不代表该字符的编码,就可以写出问号。

答案 2 :(得分:0)

这些表达式评估为true:

((char) 145) == '\u0091';
((char) 129) == '\u0081';

这些UTF-16值映射到Unicode code points U + 0091和U + 0081:

0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
0081;<control>;Cc;0;BN;;;;;N;;;;;

这些都是没有可见字素的控制字符(问号充当替换字符),其中一个是私人使用,因此没有指定用途。这两个都不在ASCII集中。