当我尝试将一些ASCII值转换为char
时,我遇到了问题。
例如:
(char)145 //returns ?
(char)129 //also returns ?
但它应该返回一个不同的角色。它也适用于许多其他值。
我希望我已经足够清楚。
答案 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集中。