바이트 스트림에 직면 할 때 인코딩을 지정하지 않고는 실제 의미를 알 수 없습니다.
이 문장은 또한 "캐릭터의 바이트, 바이트에서 캐릭터"의 문제에 직면 할 때 우리의 마음 속에서 항상 기억하는 것이어야합니다. 그렇지 않으면, 차량 문제가 뒤따를 수 있습니다.
실제로, 멍청한 문제의 본질은 인코딩 및 디코딩이 동일한 인코딩을 사용하지 않는다는 것입니다. 이 원칙을 이해한다면, 멍청한 문제를 쉽게 해결할 수 있습니다.
자바에서 일반적으로 사용되는 것은 다음과 같습니다.
1. 문자열 클래스는 바이트 []의 생성자 문자열 (byte [] bytes)를 사용합니다. 문자열 클래스는 동시에 두 개의 과부하를 제공합니다 (1) String (byte [] bytes, charset charset)
(2) String (byte [] bytes, string charsetname)는 인코딩을 지정하는 데 사용됩니다.
2. 문자열 클래스의 getBytes 함수 byte [] getBytes ()에는 다음 두 가지 과부하가 있습니다.
(1) 바이트 [] getbytes (charset charset)
(2) 바이트 [] getBytes (String charsetname)
지정된 인코딩이 필요하지 않은 모든 것은 플랫폼의 기본 숯을 사용하여 얻어지며 System.GetProperty ( "file.encoding"), charset.defaultcharset ()을 사용하여 얻을 수 있습니다.
3. Printstream의 Print (String S) 도이 문제로 설계되었습니다. 이러한 이유로 PrintStream의 생성자는 PrintStream (파일 파일) 및 PrintStream (파일 파일, String CSN) 일뿐입니다.
그렇지 않으면 문자열의 문자는 플랫폼의 기본 문자 인코딩에 따라 바이트로 변환됩니다.
DataOutputStream Construction에는 인코딩을 지정하는 메소드가 없지만 writeUtf (String Str)를 제공합니다.
인코딩을 지정할 필요성을 설명하기 위해 처음에 예제를 제시하십시오.
웹 페이지가 인코딩을 UTF-8, <meta http-equiv = "content-type"content = "text /html; charset = utf-8" />로 지정하는 경우, 페이지에 양식이 있으며 서블릿에 제출됩니다.
그런 다음 사용자가 입력 한 문자가 통과 한 바이트 스트림은 지정된 인코딩에 따라 인코딩합니다. 예를 들어, "Hello Hello"를 입력하면 UTF-8 인 경우 전송 된 것은 다음과 같습니다.
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, 우리는 다음 한자 각각이 3 바이트를 사용하는 것으로 나타 났으며, 이는 UTF-8의 관련 지식을 참조하는 데 사용할 수 있습니다.
그러나 페이지가 GBK를 지정하면 전송이 다릅니다.
[104, 101, 108, 108, 111, -60, -29, -70, -61]
따라서 Servlet 측에서 request.getParameter를 사용하는 경우 내부적으로 호출해야합니다.
문자열 s = 새 문자열 (bytes, response.getencoding ()). 응답이 인코딩을 설정하지 않으면 기본 인코딩 NULL이 Java 플랫폼의 경우 GBK로 변환되고 중국어가 해제됩니다.
따라서 차량화 된 코드를 피하기 위해 JSP 사이트는 일반적으로 필터를 설정하고 모든 페이지와 서베트에는 통합 인코딩이 설정됩니다. Response.setEncoding, request.setencoding.
내부 Java 문자열은 char []이며 UTF-16이 16 비트로 저장된 유닛입니다. 이를 위해 문자와 문자열을 바이트로 변환하여 파일 또는 네트워크로 출력하거나 파일 또는 네트워크에서 실질적인 의미를 가진 문자로 읽는 바이트 스트림을 되 찾을 때 인코딩이 무엇인지 이해해야합니다.
일부 경험
1. 문자열 클래스는 항상 유니 코드 인코딩에 저장됩니다.
2. String.getBytes ()의 사용에주의를 기울입니다.
문자 세트 매개 변수가 포함되지 않으면 JVM의 문자 세트 인코딩에 따라 다릅니다. 일반적으로 Linux의 유니 코드 및 Windows에서는 GBK입니다. (JVM의 기본 문자 세트 인코딩을 변경하려면 JVM을 시작할 때 옵션 -dfile.encode.encode = utf -8을 사용하십시오.
안전상의 이유로, 예를 들어, 매개 변수와 함께 항상 호출하는 것이 좋습니다. s.getBytes ( "UTF-8").
3. 숯불 클래스는 매우 유용합니다.
(1) charset.encode가 인코딩, 즉 문자열을 인코딩하고 바이트 배열을 지정하고 출력하는 문자 세트 인코딩 형식으로 인코딩합니다.
(2) charset.decode는 디코딩 중입니다. 즉, 문자열로 지정하고 출력하는 문자 세트 인코딩 형식의 바이트 배열을 디코딩합니다.
예를 들어 :
문자열 s = charset.defaultcharset (). displayName (); 문자열 s1 = "나는 당신, 내 사랑을 좋아합니다"; 바이트 버퍼 bb1 = bytebuffer.wrap (s1.getBytes ( "utf-8")); for (byte bt : bb1.array ()) {system.out.printf ( "%x", bt); } // char [] usage char [] charray = { 'i', 'l', 'o', 'v', 'e', 'you'}; // charbuffer 사용법 charbuffer cb = charbuffer.wrap (charray); // refosition pointer cb.flip (); 문자열 s2 = 새 문자열 (charray); // 바이트 버퍼 사용량 바이트 버퍼 BB2 = charset.forname ( "UTF-8"). Encode (cb); // charset을 사용하여 지정된 문자로 인코딩하여 ByteBuffer BB3 = charset.forname ( "UTF-8"). encode (s1); 바이트 [] b = bb3.array (); // 지정된 문자에 따라 charset을 사용하여 문자열로 decode bytebuffer bb4 = bytebuffer.wrap (b); 문자열 s2 = charset.forname ( "utf-8"). decode (bb4) .toString ();