簡體   English   中英

字符串到二進制字符串-為什么有些字符是多字節的?

[英]Character strings to binary string - why are some characters multi-byte?

該代碼應該將字符串轉換為二進制字符串,但是如果有一些字符串,它將返回一個字符串,該String包含16個二進制數字,而不是我期望的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();  
    } 

}

在前兩個字符串中,我不明白為什么它們返回2個字節,因為它們是單字符字符串。

編譯到這里: https : //ideone.com/AbxBZ9

返回:

11000010 10101010 
11000011 10011000 
00101000 
number of bytes :2
number of bytes :2
number of bytes :1

我正在使用此代碼: 在Java中將字符串(如testing123)轉換為二進制

NetBeans IDE 8.1

字符並不總是1字節長。 考慮一下-許多語言(例如中文或日文)都有成千上萬個字符,您如何將這些字符映射到字節?

您正在使用UTF-8 (將字符映射到字節的多種方法之一)-查找UTF-8的字符表,並搜索序列11000010 10101010 ,我得到了

U+00AA  ª   11000010 10101010

ª的UTF-8編碼。 UTF-8通常是Java的默認字符編碼(字符集)-但您不能依靠它。 這就是為什么在將字符串轉換為字節時應始終指定字符集的原因反之亦然

您可以通過運行以下簡單代碼來理解為什么某些字符是兩個字節

    // integer - binary 
    System.out.println(Byte.MIN_VALUE);             
    // -128 - 0b11111111111111111111111110000000

    System.out.println(Byte.MAX_VALUE);             
    // 127 - 0b1111111

    System.out.println((int) Character.MIN_VALUE);  
    // 0   - 0b0

    System.out.println((int) Character.MAX_VALUE);  
    // 65535 - 0b1111111111111111

如您所見,我們可以僅顯示7 bits1 byte (01111111)來顯示Byte.MAX_VALUE 1 byte (01111111)

如果將Character.MIN_VALUE為整數,則將為: 0
我們可以用one bit1 byte (00000000)來顯示它的二進制格式!

但是Character.MAX_VALUE呢?

二進制格式是1111111111111111 ,十進制格式是65535
並且可以顯示為2 bytes (11111111 11111111)

因此十進制格式在0 and 65535之間的字符可以用1 or 2 bytes

希望你能理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM