UTF-8과 UTF-16의 차이점은 무엇입니까? 왜 우리는 이것들이 필요합니까?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
UTF-8과 UTF-16의 차이점은 무엇입니까? 왜 우리는 이것들이 필요합니까?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
답변:
웹에 대한 좋은 기사가 많이 있다고 생각하지만 여기에 간단한 요약이 있습니다.
UTF-8과 UTF-16은 모두 가변 길이 인코딩입니다. 그러나 UTF-8에서 문자는 최소 8 비트를 차지할 수 있지만 UTF-16에서 문자 길이는 16 비트로 시작합니다.
주요 UTF-8 전문가 :
주요 UTF-8 단점 :
주요 UTF-16 전문가 :
char
를 문자열의 기본 구성 요소로 사용할 수 있습니다 .주요 UTF-16 단점 :
일반적으로 UTF-16은 BE / LE가 관련이없고 (기본 순서 만 사용) 인덱싱이 더 빠르기 때문에 (대리 쌍을 올바르게 처리하는 것을 잊지 마십시오) 일반적으로 인 메모리 표현에 더 좋습니다. 반면에 UTF-8은 BE / LE 문제가없고 널 종료가 종종 ASCII 호환뿐만 아니라 텍스트 파일 및 네트워크 프로토콜에 매우 유용합니다.
유니 코드 문자를 나타내는 다른 방식 일뿐입니다.
둘 다 가변 길이입니다. UTF-16은 기본 다국어 플레인 (BMP)의 모든 문자에 2 바이트를 사용하며 대부분의 문자는 일반적으로 사용됩니다.
UTF-8은 BMP의 문자에 1에서 3 바이트를 사용하고 U + 0000에서 U + 1FFFFF까지의 현재 유니 코드 범위의 문자에 대해 최대 4 바이트를 사용하며 필요한 경우 U + 7FFFFFFF까지 확장 할 수 있습니다. 그러나 모든 ASCII 문자는 각각 단일 바이트로 표시됩니다.
메시지 다이제스트의 목적으로 다이제스트를 다시 만들려고하는 모든 사람이 동일한 옵션을 사용하는 한 어떤 것을 선택하든 상관 없습니다.
UTF-8 및 유니 코드에 대한 자세한 내용은 이 페이지 를 참조하십시오 .
(모든 Java 문자는 BMP 내의 UTF-16 코드 포인트입니다. U + FFFF보다 높은 문자를 나타내려면 Java에서 서로 게이트 쌍을 사용해야합니다.)
UTF-8과 UTF-16의 차이점은 무엇입니까? 왜 우리는 이것들이 필요합니까?
UTF-16 구현에는 적어도 몇 가지 보안 취약점이있었습니다 . 자세한 내용은 Wikipedia를 참조하십시오 .
WHATWG 와 W3C 는 이제 UTF-8 만 웹에서 사용되도록 선언 했습니다 .
여기에 요약 된 [security] 문제는 UTF-8을 독점적으로 사용할 때 사라집니다. 이는 이제 모든 것에 대한 필수 인코딩 인 여러 가지 이유 중 하나입니다.
다른 그룹들도 같은 말을하고 있습니다.
따라서 UTF-16이 Java 및 Windows와 같은 일부 시스템에서 계속 내부적으로 사용될 수 있지만 데이터 파일, 데이터 교환 등에서 과거에 보았던 UTF-16의 사용은 거의 사라질 것입니다.
이것은 UTF-8 / 16과 관련이 없습니다 (일반적으로 UTF16으로 변환하고 BE / LE 부분을 한 줄로 설정할 수 있지만) 아래는 String을 byte []로 변환하는 가장 빠른 방법입니다. 예를 들어, 제공된 사례에 정확히 맞습니다 (해시 코드). String.getBytes (enc)는 상대적으로 느립니다.
static byte[] toBytes(String s){
byte[] b=new byte[s.length()*2];
ByteBuffer.wrap(b).asCharBuffer().put(s);
return b;
}
UTF-8과 UTF-16을 구별하는 간단한 방법은 이들 사이의 공통성을 식별하는 것입니다.
주어진 문자에 대해 동일한 유니 코드 번호를 공유하는 것 외에 각각 고유 한 형식입니다.