컴퓨터 의 인 코딩 문 제 를 늘 이야기 하 다.

7180 단어 컴퓨터.부호화
질문
컴퓨터 는 숫자 만 처리 할 수 있 기 때문에 텍스트 를 처리 하려 면 먼저 텍스트 를 숫자 로 변환 해 야 처리 할 수 있다.최초의 컴퓨터 는 디자인 할 때 8 개의 비트(bit)를 하나의 바이트(byte)로 사 용 했 기 때문에 한 바이트 가 표시 할 수 있 는 가장 큰 정 수 는 255(2 진법 11111111=10 진법 255)이 고 더 큰 정 수 를 표시 하려 면 더 많은 바이트 를 사용 해 야 한다.예 를 들 어 두 바이트 가 표시 할 수 있 는 최대 정 수 는 65535 이 고 4 바이트 가 표시 할 수 있 는 최대 정 수 는 4294967295 이다.
현재 자주 사용 되 는 인 코딩
ASCII 인 코딩:컴퓨터 는 미국인 이 발명 한 것 이기 때문에 최초 로 127 개의 자모 만 컴퓨터 에 인 코딩 되 었 다.즉,대소 문자 영문 자모,숫자 와 일부 기호 이다.이 인 코딩 표 는 ASCII 인 코딩 이 라 고 불 린 다.예 를 들 어 대문자 A 의 인 코딩 은 65 이 고 작은 자모 z 의 인 코딩 은 122 이다.
GB 시리즈 인 코딩:그러나 중국 어 를 처리 하려 면 한 바이트 가 부족 하고 적어도 두 바이트 가 필요 하 며 ASCII 인 코딩 과 충돌 할 수 없 기 때문에 중국 은 GB 2312 인 코딩 을 제정 하여 중국 어 를 편집 하 는 데 사용 했다.더 나 아가 전 세계 에서 백 가지 언어 가 있 는데 일본 은 일본 어 를 Shift 로 엮 었 다.JIS 에 서 는 한국 이 Euc-kr 에 한글 을 엮 어 각국 의 기준 이 있 으 면 충돌 이 불가피 하 게 발생 하 는데,결과적으로 다 국어 가 혼 합 된 텍스트 에 난 코드 가 표 시 될 수 있다 는 것 이다.GB 시리즈 인 코딩 은 한 자 를 저장 하 는 데 사용 되 는 우리 나라 의 국가 표준 인 코딩 으로 GB 2312,GBK,GB 18030 으로 나 뉘 어 기본적으로 앞으로 호 환 될 수 있 으 며 그 중에서 GBK 는 현재 가장 통용 되 고 있다.
유 니 코드 인 코딩:유 니 코드 는 모든 언어 를 하나의 인 코딩 으로 통일 시 켜 더 이상 어 지 러 운 문제 가 없 도록 합 니 다.유 니 코드 표준 도 계속 발전 하고 있 지만 가장 많이 사용 되 는 것 은 두 바이트 로 한 문 자 를 표시 하 는 것 이다(매우 외 진 문 자 를 사용 하려 면 4 바이트 가 필요 하 다).현대 운영 체제 와 대부분의 프로 그래 밍 언어 는 유 니 코드 를 직접 지원 한다.그러나 그 는 문자 의 인 코딩 만 규정 하고 문자 가 어떤 방식 으로 저장 되 거나 전송 되 는 지 는 규정 하지 않 았 다.그래서 UTF 시리즈 인 코딩 은 유 니 코드 인 코딩 의 저장 과 전송 방식 을 규정 합 니 다.
UTF 인 코딩 시리즈:현재 가장 많이 사용 되 는 UTF 인 코딩 은 3 가지 로 나 뉘 는데 UTF-8,UTF-16 과 UTF-32 이다.우 리 는 컴퓨터 가 8 비트 를 하나의 바이트 로 데 이 터 를 저장 하 는 것 을 알 고 있 고 UTF-16,UTF-32 는 각각 2 바이트 와 4 바이트 로 한 문 자 를 표시 하기 때문에 바이트 의 저장 순서 와 관련 되 는데 낮은 비트 가 앞 에 있 는 지 높 은 비트 가 앞 에 있 는 지 이렇게 해서 BOM 이 생 겼 다.
BOM 은 텍스트 파일 의 시작 부분 에 있 는 특수 한 태그 로 특수 한 숫자 로 텍스트 파일 의 바이트 순 서 를 표시 합 니 다.UTF-8 바이트 순 서 는 정 해 져 있 지만,UTF-16 과 UTF-32 를 호 환 하기 위해 UTF-8 인 코딩 을 표시 하 는 데 사용 할 수 있 도록 UTF-8 의 BOM 도 규정 했다.다만 UTF-8 의 BOM 은 플랫폼 별로 규정 이 다 르 니 조심해 서 사용 해 야 한다.
BOM 규정 은 다음 과 같다.
UTF-8 EF BB BF
UTF-16(LE) FF FE
UTF-16(BE) FE FF
UTF-32(LE) FF FE 00 00
UTF-32(BE) 00 00 FE FF
UTF-8 인 코딩:유 니 코드 인 코딩 으로 통일 되면 인 코딩 문제 가 사라 집 니 다.그러나 당신 이 쓴 텍스트 가 기본적으로 모두 영어 라면 유 니 코드 인 코딩 으로 ASCII 인 코딩 보다 두 배 이상 의 저장 공간 이 필요 하 며 저장 과 전송 에 있어 서 는 매우 수지 가 맞지 않 습 니 다.그래서 절약 정신 에 따라 유 니 코드 인 코딩 을'가 변 길이 인 코딩'으로 바 꾸 는 UTF-8 인 코딩 도 등장 했다.UTF-8 인 코딩 은 하나의 유 니 코드 문 자 를 숫자 크기 에 따라 1-6 개의 바이트 로 인 코딩 하고,자주 사용 하 는 영문 자 모 는 1 개의 바이트 로 인 코딩 하 며,한 자 는 보통 3 개의 바이트 이 며,매우 생소 한 문자 만 4-6 개의 바이트 로 인 코딩 된다.전송 할 텍스트 에 영문 문자 가 많이 포함 되 어 있다 면 UTF-8 인 코딩 으로 공간 을 절약 할 수 있 습 니 다.
문자
ASCII
Unicode
UTF-8
A
01000001
00000000 01000001
01000001
중.
X
01001110 00101101
11100100 10111000 10101101
2.컴퓨터 시스템 의 인 코딩 응용
컴퓨터 메모리 에서 유 니 코드 인 코딩 을 통일 적 으로 사용 하고 하 드 디스크 에 저장 하거나 전송 이 필요 할 때 UTF-8 인 코딩 으로 변환 합 니 다.메모 장 으로 편집 할 때 파일 에서 읽 은 UTF-8 문 자 를 메모리 로 변환 하고 편집 이 완료 되면 저장 할 때 유 니 코드 를 UTF-8 로 변환 하여 파일 에 저장 합 니 다.

웹 페이지 를 탐색 할 때 서버 는 동적 으로 생 성 된 유 니 코드 내용 을 UTF-8 로 변환 하여 브 라 우 저 로 전송합니다.

그래서 많은 웹 페이지 의 원본 코드 에와 유사 한 정보 가 있 는 것 을 보면 이 웹 페이지 가 바로 UTF-8 인 코딩 을 사용 하고 있 음 을 나타 낸다.
질문
eclipse 에서 자바 프로젝트 의 인 코딩 이 어떤 지 demo 를 직접 써 보 세 요.
1.문자열 이 바이트 시퀀스 로 전환

public class EncodeDemo {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String s="  de  ";
  byte[] bytes1=s.getBytes();//             ,                  
  for(byte b: bytes1)
  //toHexString        (    Int) 16       
  System.out.print(Integer.toHexString(b & 0xff)+" ");// & 0xff       24 0        
 }

}
실행 결과:

분석:이 자바 프로젝트 의 기본 인 코딩 에서 한 자 는 2 개의 바이트 로 표시 하고 영 어 는 하나의 바이트 로 표시 하 는 것 을 볼 수 있 습 니 다.
항목 을 보 는 기본 인 코딩 은GBK 입 니 다.
프로젝트 의 기본 인 코딩 형식 을 사용 하지 않 으 려 면 다음 방법 으로 문자열 을 원 하 는 인 코딩 형식 으로 지정 할 수 있 습 니 다.

byte[] bytes2=s.getBytes("utf-8");//   utf-8  
  for(byte b: bytes2)
   //toHexString        (    Int) 16       
   System.out.print(Integer.toHexString(b & 0xff)+" ");// & 0xff       24 0        
  System.out.println();
  byte[] bytes3=s.getBytes("utf-16be");//   java     ,utf-16be  
  for(byte b: bytes3)
   //toHexString        (    Int) 16       
   System.out.print(Integer.toHexString(b & 0xff)+" ");// & 0xff       24 0        
실행 결과:

분석:두 가지 결 과 를 비교 해 보면 알 수 있다.
gbk 인 코딩:중국 어 는 두 개의 바이트 를 차지 하고 영 어 는 한 개의 바이트 를 차지한다.
utf-8 인 코딩:중국 어 는 세 개의 바이트 를 차지 하고 영 어 는 한 개의 바이트 를 차지한다.
utf-16be 인 코딩:중국 어 는 두 개의 바이트 를 차지 하고 영 어 는 두 개의 바이트 를 차지한다.
메모:자 바 는 쌍 바이트 인 코딩 이 고 utf-16be 인 코딩 입 니 다.즉 자바 의 한 글자(char)가 두 바이트 를 차지 합 니 다!
2.바이트 시퀀스 에서 문자열 로 전환
바이트 시퀀스 가 어떤 인 코딩 일 때,이 럴 때 바이트 시퀀스 를 문자열 로 바 꾸 려 면 이런 인 코딩 방식 을 사용 해 야 합 니 다.그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.

String str1=new String(bytes1);//               ,      
  System.out.println(str1);
  String str2=new String(bytes2);
  System.out.println(str2);
  String str3=new String(bytes2,"utf-8");
  System.out.println(str3);
실행 결과:

4.텍스트 파일(txt)의 인 코딩 문제
텍스트 파일 은 바이트 시퀀스 로 임의의 인 코딩 바이트 시퀀스 일 수 있 습 니 다.
만약 에 우리 가 중국어 기기 에서 텍스트 파일 을 직접 만 들 면 이 파일 은 ANSI 인 코딩 만 알 고 있 습 니 다(예 를 들 어 컴퓨터 에서 오른쪽 단 추 를 누 르 면 텍스트 파일 을 만 듭 니 다).
여기 서 주의해 야 할 것 은 텍스트 파일 을 직접 만 들 때 만 이 파일 의 인 코딩 은 ANSI 만 알 지만 텍스트 파일 자 체 는 임의의 인 코딩 을 넣 을 수 있 는 바이트 시퀀스 입 니 다.
메모:중국어 시스템 에서 ANSI 인 코딩 은 GBK 인 코딩 입 니 다.
여기 예 를 들 면:
eclipse 에 새 항목 을 만 들 고 기본 인 코딩 을 utf-8 로 바 꿉 니 다.

이 항목 에 대해 서 는 utf-8 인 코딩 파일 만 알 고 있 습 니 다.
다음은 이 항목 에 텍스트 파일 utf-8.txt 를 새로 만 들 고 다음 과 같은 내용 을 입력 하 십시오.

이 텍스트 파일 을 다른 항목 으로 직접 복사 하면(기본 값 은 GBK 인 코딩)내용 이 어 지 러 워 집 니 다!코드 가 달라 서!
그러나 안에 있 는 내용 을 복사 해서 붙 여 넣 으 면 시스템 이 자동 으로 해당 하 는 인 코딩 으로 바 뀌 어 어 어 지 럽 히 지 않 는 다.

메모:이 텍스트 파일 을 다른 곳(예 를 들 어 시스템 데스크 톱)에 복사 하면 오류 가 발생 하지 않 습 니 다!!텍스트 파일 은 임의의 인 코딩 시퀀스 일 수 있 기 때문에 시스템 은 텍스트 파일 을 읽 을 때 자동 으로 해당 하 는 인 코딩 형식 으로 전 환 됩 니 다.
파일 의 인 코딩 을 알 면 무슨 소 용이 있 습 니까?자바 의 IO 흐름 에서 우 리 는 파일 을 읽 고 써 야 하 며,바이트 흐름 을 사용 하여 읽 고 쓸 때 는 서로 다른 인 코딩 방식 에 따라 읽 고 써 야 한다.서로 다른 인 코딩 방식 의 각 문자 가 차지 하 는 바이트 수가 다 르 기 때문에 우 리 는 실제 상황 에 따라 조작 해 야 한다.
이상 의 이 상투적인 컴퓨터 의 인 코딩 문제(필수 편)는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 할 수 있 고 여러분 들 이 우 리 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기