为什么字符在128号后不能打印

时间:2016-08-28 12:40:01

标签: java charts binary

在我的项目中,我尝试将二进制数转换为整数并将整数转换为字符。但经过128号打印后只能'?'字符。请帮我打印最多250个字符。我的代码是

 class b 
  {
  public static void main(String[] args) 
  {
                        String dec1="11011001" ;

                        System.out.println(dec1);
                        int dec = Integer.parseInt(dec1, 2);
                        System.out.println(dec);
                        String str = new Character((char)dec).toString();
                        System.out.println("decrypted number is "+str);
    }
    }

谢谢。

4 个答案:

答案 0 :(得分:3)

并非所有字节值都具有与之关联的可打印字符,ASCII不具有,许多/大多数unicode字节不具有,并且范围0x00-0x1f都是不可打印的控件,例如DC1,Bell,Backspace等.Unicode具有相同的前32个字符保留为不可打印。

高于127(0x7f)的字节值在不同的编码中具有不同的含义,编码很多。历史上,ASCII是默认编码,并且有许多扩展。目前标准是unicode,存在多种类型,包括UTF-8,UTF-16(LE,BE和BOM)和UTF-32(LE,BE和BOM)。 UTF8常用于交换,特别是在网络和UTF-16内部的许多系统中。

根据编码和字形(显示的表示),可能需要一个到超过16个字节来表示单个字形。表情符号主要位于代码平面1中,这意味着它们的代码点需要超过16位(unicode是一个21位编码系统)。此外,一些字形由一系列代码点表示,例子是将国家与旗帜组合在一起的标志,以及与“joiners”结合的表情符号。

在217(0xd9)的情况下,它不是UTF-8中的合法代码点,而217是两个字节(16位整数)(0x00d9)是Ù的有效表示。

请参阅ASCIIUnicode

答案 1 :(得分:2)

问题是您的控制台编码与Java程序输出的编码不匹配。我不知道您使用的是哪个控制台,但在Windows上,您可以运行此命令来查看当前的编码:

chcp

美国的默认控制台编码为437,西欧和加拿大850编码。这些编码包含ASCII编码的128个字符和128个不同编码的字符。除了128个ASCII字符之外什么也得不到,因为Java输出的编码与控制台的编码不匹配。你必须改变其中一个以匹配另一个。

您可以通过运行以下命令将控制台的编码更改为UTF-8:

chcp 65001

如果您不在Windows上,则必须搜索系统的等效命令。但我相信大多数Linux&在Unix派生系统中,您可以使用locale命令查看当前编码,并使用export命令进行更改。

答案 2 :(得分:2)

根据您的代码,首先将二进制文件转换为Integer,然后将Integer转换为Character,这是通过检查ASCII值来完成的。

它将返回与您要转换的整数dec1具有相同ASCII值的字符。由于在ASCII TABLE中值最多为127,因此您将获得整数值127的字符,因此,对于dec1的较大值而不是127,您将得到?字符,这将是然后转换为String。

前32个元素是不可打印的字符,所以你会得到一些奇怪的符号,但是对于32-126范围内dec1的值,你将获得分配给该特定字符的字符根据{{​​3}}的ASCII值。由于值127被分配给DEL,因此您将获得值dec 127。

的奇怪符号

答案 3 :(得分:-1)

我从您的代码中收到以下输出。我假设您在不支持该角色的环境/控制台中运行该程序。您需要一个支持UTF-8,UTF-16或类似设备的控制台,以便能够打印您为其设置数值的所有字符。

11011001
217
decrypted number is Ù