字符串到二进制字符串 - 为什么有些字符是多字节的?

0 java string binary ascii

这段代码应该将字符串转换为二进制字符串,但是有几个字符串,它返回一个String16位二进制数字,而不是我预期的那样的8位数字.

public class aaa {        
    public static void main(String argv[]){
        String nux="ª";
        String nux2="Ø";
        String nux3="(";
        byte []bites = nux.getBytes();
        byte []bites2 = nux2.getBytes();
        byte []bites3 = nux3.getBytes();
               System.out.println(AsciiToBinary(nux));
               System.out.println(AsciiToBinary(nux2));
               System.out.println(AsciiToBinary(nux3));
               System.out.println("number of bytes :"+bites.length);
               System.out.println("number of bytes :"+bites2.length);
               System.out.println("number of bytes :"+bites3.length);


    }

    public static String AsciiToBinary(String asciiString){  

          byte[] bytes = asciiString.getBytes();  
          StringBuilder binary = new StringBuilder();  
          for (byte b : bytes)  
          {  
             int val = b;  
             for (int i = 0; i < 8; i++)  
             {  
                binary.append((val & 128) == 0 ? 0 : 1);  
                val <<= 1;  
             }  
             binary.append(' ');
          }  
          return binary.toString();  
    } 

}
Run Code Online (Sandbox Code Playgroud)

在前两个字符串中,我不明白为什么它们返回2个字节,因为它们是单字符字符串.

编译在这里:https://ideone.com/AbxBZ9

返回:

11000010 10101010 
11000011 10011000 
00101000 
number of bytes :2
number of bytes :2
number of bytes :1
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码:转换字符串(如testing123)到二进制在Java中

NetBeans IDE 8.1

tuc*_*uxi 6

字符长度不总是1个字节.想一想 - 许多语言,如中文或日文,都有数千个字符,你会如何将这些字符映射到字节?

您正在使用UTF-8(将字符映射到字节的众多方法之一) - 查找UTF-8的字符表,并搜索序列11000010 10101010,我到达

U+00AA  ª   11000010 10101010
Run Code Online (Sandbox Code Playgroud)

哪个是UTF-8编码ª.UTF-8通常是Java的默认字符编码(charset) - 但你不能依赖它.这就是为什么你应该总是指定一个字符集转换时字符串字节反之亦然