자바 문자 인코딩의 분석

이 문서는 처음부터 문제에 대해 실제로 : 자바 문자 유형은 한자 그 안에 저장 될 수있다?

UTF-8 인코딩

UTF-8은 인터넷에서 유니 코드를 사용하여 가장 널리 사용되는 구현입니다. 다른 구현은 또한 실질적으로없는 인터넷, UTF-16 (문자 두 바이트 또는 4 바이트)과 UTF-32 (문자로 나타내는 4 바이트)를 포함하는 방법. 반복, 여기의 관계, UTF-8 유니 코드 구현의 하나입니다. UTF-8의 가장 큰 특징은 가변 길이 인코딩 것입니다. 이것은 하나 개의 심볼의 1 내지 4 바이트 일 수 있고, 바이트 길이가 기호에 따라 달라진다.
UTF-8 인코딩 규칙은 두 매우 간단합니다 :

단일 바이트 기호 (1)은, 첫번째 바이트는 0으로 유니 코드 심볼의이면 (7)을 설정한다. 따라서, 영어 알파벳을 위해, UTF-8 인코딩 및 ASCII 코드는 동일합니다.
N 바이트 (N> 1)의 부호 2.은, 첫번째 바이트의 제 n 비트가 1로 설정되고, 제 n + 1 비트가 0으로 설정되고, 후방의 제 2 바이트에 균일하게 열을 설정. 나머지 비트들은 모든 유니 코드 심볼 언급하지.
다음 표는 인코딩 규칙, 문자 X 사용 가능한 인코딩 비트를 나타냅니다을 요약 한 것입니다.

유니 심볼 범위 (16 진수) UTF-8 인코딩 (바이너리)
0000 0000-0000 007F 0xxxxxxx와
0000 0080-0000 07FF 110xxxxx에 10xxxxxx에
0000 0800-0000 FFFF 1110xxxx와 10xxxxxx에 10xxxxxx에
0001 0000-0010 FFFF 11110xxx 10xxxxxx에 10xxxxxx에 10xxxxxx에

이 UTF-8 인코딩을 읽는 것은 매우 간단합니다, 테이블에 지금이다. 첫 번째 바이트가 0 인 경우, 이것은 단일 바이트 문자는 상기 제 1 비트가 연속 한 수 있다면, 현재의 글자가 차지하는 바이트 수를 나타낸다.
아래, 또는 한자로 "엄격한는"예를 들어, UTF-8 인코딩을 구현하는 방법을 보여줍니다.
공지 된 "엄격한"유니 4E25 (100,111,000,100,101)의 표에있어서, 4E25 번째 행 (0000 0800-0000 FFFF)의 범위에서 발견 될 수 있고, 따라서 인 "고정"UTF-8 인코딩은 3 바이트를 필요 형식이 있음 "1110xxxx와 10xxxxxx에 10xxxxxx에". 그런 다음 "엄격한"마지막 비트 시작에서, 전면 후면에서 x의 형식으로 별도의 비트 0을 입력합니다. 이것은 "엄격한"UTF-8 인코딩 결과는 "11100100 1,011,100,010,100,101"16 진수로 변환 E4B8A5이다.

UTF-16 인코딩

유니 UTF-16은 일 실시 예에서 사용된다. UTF는 형식으로 작업 유니 코드의 의미 유니 코드 TransferFormat이다. UTF-16 UTF-8보다가, 혜택의 대부분은 문자 바이트 (2 바이트) 고정 길이를 저장하지만, UTF-16 ASCII에와 있습니다 호환되지하는 것이다. UTF-16의 보존 형태의 크고 작은 단부가 사용된다. 파일 끝의 크기를 명확히하기 위해 UTF-16, UTF-16 파일의 시작 부분에은을 (FF FE 대표, UTF의 FE FF 대표 16BE - 투에 UTF-16LE) 문자 U + FEFF 바이트 순서 표시로 배치됩니다 텍스트 파일은 이름에서 알 수 있듯이, 그것은 더 폭없고 하이픈 비어, U + FEFF 유니 코드 문자의 의미가 ZERO WIDTH NO-BREAK 공간에서 표현되는 UTF-16 코드가 표시됩니다.

예를 설명하기

예 1

1 
2
3
4
5
6
7
8
9
10
11
12
문자열의 = "나는李博玉해요"; 
바이트 [] = charArr s.getBytes (Charset.forName ( "UTF-16"));
(바이트 B : charArr)가 {
System.out.printf ( "%의 X ', b);
}
에서 System.out.println (s.getBytes (Charset.forName ( "UTF-16"))의 길이.);

charArr = s.getBytes (Charset.forName ( "UTF-8"));
(바이트 B : charArr)가 {
System.out.printf ( "%의 X ', b);
}
에서 System.out.println (s.getBytes (Charset.forName ( "UTF-8"))의 길이.);

출력의 결과는 무엇입니다?
FF로 49 0 27 0 0 0 FE 6D 4E 67 20 73 53 임. 5A 89
16
49 27 20 6D 8D. 9A E5 E6 E7은 8E 9D 89 8E
13 인

1.UTF-16를 코딩하는 이유 (16)는 무엇입니까?
문자의 대부분이 말하기를 들어, UTF-16은 가게에 2 바이트를 사용합니다. 그러나, UTF-16은 상기지지면의 크기는, 제 캐릭터에 그 좋은 엔디안 FF FE 표시 빅 엔디안 스토리지 2 바이트를 추가 공간을 지정하는 것이 필요하다.
7 × 2 + 2 = 16 개의
부호화가 왜 2.UTF-8 (13)?
UTF-8은 ASCII 인코딩과 완벽하게 호환됩니다, 그것은 하나의 영어 바이트, 중국어 대부분의 3 바이트가 아닌 4 바이트 일반적인
4 + 3 × 3 = 13

예 2

문자열 S1 = "李";
문자열 S2 = " "
에서 System.out.println (s1.length ());
에서 System.out.println (s2.length ());

출력의 결과는 무엇입니다?
1
2는
이 결과가 어떻게 문제가 결국 붕괴되지 않은 참조?

1. .length의 의미를 이해하는 것이 제일 먼저 문자열의 내부 문자 배열의 형태로 저장된다 .length는 문자 배열의 길이를 의미 CHAR는 UTF-16은 리 흔히 사용되는 단어, UTF-16 인코딩을 인코딩 된 두 바이트 후에는 길이가 1 있도록하면서, 숯불을 저장하는 것이 가능하다 UTF-16은 4 바이트 저장된 두 문자의 총 코딩, 길이가 2 인

원본 : 큰 상자  자바 문자 인코딩 분석


추천

출처www.cnblogs.com/chinatrump/p/11597139.html