2016-09-29 8 views
4
import java.io.UnsupportedEncodingException; 
import java.nio.charset.StandardCharsets; 
import java.util.Arrays; 

public class Java87String { 

public static void main(String[] args) throws UnsupportedEncodingException { 
     // TODO Auto-generated method stub 

     //byte[] b = {-101, 53, -51, -26, 24, 60, 20, -31, -6, 45, 50, 103, -66, 28, 114, -39, 92, 23, -47, 32, -5, -122, -28, 79, 22, -76, 116, -122, -54, -122}; 
     //byte[] b = {-76, -55, 85, -50, 80, -23, 27, 62, -94, -74, 47, -123, -119, 94, 90, 61, -63, 73, 56, -48, -54, -4, 11, 79}; 

     byte[] b = { -5, -122, -28}; 

     System.out.println("Input Array :" + Arrays.toString(b)); 
     System.out.println("Array Length : " + b.length);      
     String target = new String(b,StandardCharsets.UTF_8); 
     System.out.println(Arrays.toString(target.getBytes("UTF-8"))); 
     System.out.println("Final Key :" + target); 

} 
} 

Приведенный выше код возвращает следующий вывод в Java 7строка (байт [] Charset) возвращает результаты по-разному в Java7 и Java 8

Input Array :[-5, -122, -28] 
Array Length : 3 
[-17, -65, -67] 
Final Key :� 

Тот же код возвращает следующий вывод в Java 8

Input Array :[-5, -122, -28] 
Array Length : 3 
[-17, -65, -67, -17, -65, -67, -17, -65, -67] 
Final Key :��� 

Похоже, что Java8 выполняет правильную замену с помощью последовательности по умолчанию [-17, -65, -67].

Почему в JDK 1.7 устраняются различия в выводах и любые известные ошибки, которые исправляют эту проблему?

+0

Возможный дубликат проблемы с кодировкой Java 8 UTF-8 (ошибка java?)] (Http://stackoverflow.com/questions/25404373/java-8-utf-8-encoding-issue-java-bug) – DVarga

ответ

1

согласно String JavaDoc:

поведение этого конструктора, когда данные байты не действительны в данной кодировке не определен. Класс CharsetDecoder следует использовать, когда требуется больше контроля процесса декодирования.

1

Я думаю, что (-5, -122, -28) является недопустимой последовательностью байтов UTF-8, поэтому JVM может выводить что угодно в этом случае. Если бы он был действительным, возможно, разные версии Java могли показывать один и тот же результат.

Имеет ли эта конкретная последовательность байтов значение? просто любопытно

+0

Это не имеет никакого значения. Другие байтовые массивы, прокомментированные в коде, ведут себя по-другому и являются другими примерами этой проблемы. –

 Смежные вопросы

  • Нет связанных вопросов^_^