원인:
인코딩과 디코딩의 불일치로 인해 문자가 깨집니다.
먼저 java.nio.charset.Charset.defaultCharset()
를 호출하여 시스템의 기본 문자 집합을 얻을 수 있습니다. 중국 Windows 시스템은 모두 GBK이므로 JVM은 기본적으로 GBK 문자 집합을 인코딩 및 디코딩에 사용합니다.
관련 비디오 학습 튜토리얼: java 교육 비디오
잘못된 코드가 발생할 가능성이 가장 큰 것은 일관되지 않은 인코딩과 디코딩입니다.
// 代码片段1: byte[] read = "你好abc".getBytes(); String result = new String(read); System.out.println(result);
이 코드에 대한 이의를 제기하는 방법은 3단계입니다:
1. 좀 더 간결하게 보이도록 여기에 쓴 것입니다. 실제로는 파일/네트워크 등 다른 미디어에서 읽을 때와 동일합니다. 원본 입력 스트림은 어떤 유형의 인코딩이고, 읽은 후의 인코딩은 어떤 유형입니까? 여기서는 인코딩 방법을 지정하지 않았으므로 기본값은 GBK입니다.
2.디코딩. 최종 작업은 모두 문자열 개체입니다. 문자열의 바이트 배열에 대한 디코딩 방법을 지정하면 최종적으로 문자열 개체를 얻을 수 있습니다. 여기에 지정된 디코딩 방법이 없으므로 기본값은 GBK입니다.
3. 문자열을 출력하고 사용합니다. 실제로 여기에는 또 다른 인코딩 및 디코딩 프로세스가 있습니다. 즉, 출력 스트림이 GBK로 인코딩되고 콘솔이 GBK로 디코딩되어 최종적으로 표시됩니다. 문자열을 출력하고 사용할 때 시스템 기본 문자 집합이 사용되기 때문에 인코딩과 디코딩에 불일치가 발생할 가능성이 없으므로 이것이 문자 깨짐의 원인이 되지 않습니다.
입력 스트림의 인코딩을 변경한다고 가정해 보겠습니다.
// 代码片段2: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read); System.out.println(result);
세 단계를 분석해 보겠습니다.
1. 인코딩, utf-8;
인코딩과 디코딩이 일관되지 않아 문자가 깨집니다.
수정 방법은 이미 명확하다고 생각합니다.
복구 방법은 다음과 같습니다.1. 일반적으로 입력 스트림의 인코딩을 제어하는 것은 어렵기 때문에 디코딩 시 입력 스트림의 인코딩 유형에 주의하세요. 우리는 일반적으로 디코딩 방법을 참조하는 입력 스트림의 관련 메서드를 호출할 때 charset 매개변수를 봅니다. 2. 출력 스트림은 인코딩 방법을 사용할 수도 있습니다. 출력 결과가 파일과 같은 입력 스트림에서 계속해서 작동되는 경우 기본 방식으로 수행되는 한 왜곡된 문자가 생성되지 않습니다. 인코딩 방법을 참조하는 출력 스트림의 관련 메서드를 호출할 때 일반적으로 charset 매개 변수를 볼 수 있습니다. 추천 관련 기사 및 튜토리얼: 위 내용은 Java의 문자가 깨졌습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!// 代码片段3:
byte[] read = "你好abc".getBytes("utf-8");
String result = new String(read,"utf-8");
System.out.println(result);