2014-10-21 3 views
0
public class ClassToTestSnippets { 

    private static ClassToTestSnippets ctts; 

    public static void main(String[] args) { 
     ctts = new ClassToTestSnippets(); 
     ctts.testThisMethod(); 
    } 

    public void testThisMethod() { 
     System.out.println("\u2014".length()); //answer is 1 
    } 
} 

위 코드 인쇄 1. 그러나 \u2014E2 80 94, 즉 3 바이트입니다. 문자열에 포함 된 바이트 수를 어떻게 알 수 있습니까?문자열에 몇 바이트가 들어 있습니까?

+1

이것은 스크린 샷 (파일이 아니라 단지 표시된 이미지)을보고 파일의 크기를 묻는 것과 같습니다. 두 가지 경우의 대답은 인코딩 된 방법에 따라 다르다는 것입니다 ... –

+1

참조 : http://stackoverflow.com/questions/9699071/what-is-the-javas-internal-represention-for-string-modified-utf -8-utf-16 – Puce

답변

8

에 따라 다릅니다. 어떤 인코딩을 사용 하시겠습니까? 내가 UTF-8ISO-8859-1에 (예를 들어) 변경하는 경우, 그것은 다른 값을 (UTF-32 시도) 인쇄 할 수 있습니다 2. 다른 인코딩을 인쇄 할 수 있습니다하지만

System.out.println("äö".getBytes("UTF-8").length); 

인쇄 4.

+0

이것은 실제 String 객체의 바이트 수가 아닙니다. 이것은 문자열의 UTF-8 표현에서 바이트 수입니다. – RealSkeptic

4

내부적으로 - Java에서 각각 char이 2 바이트를 차지하므로 (내부 문자 수) * 2 바이트를 포함합니다 (Java의 일반 문자는 16 비트 유니 코드). 실제 바이트는 0x20 및 0x14입니다.

그러나 length 함수는 바이트 수가 아닌 문자 수를 반환합니다.

+1

UTF-32는 어떻게 저장합니까? 그러면 어떻게 될까요? –

+0

내부적으로 그 이상을 포함합니다. 여기에 내부 char []의 크기 만 세고있다. 전체 String의 크기가 더 크다. – Kayaman

+0

0xFFFF 코드 포인트 위에있는 문자에는 두 개의 서로 게이트 문자를 사용합니다. 오라클의 [튜토리얼] (http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html)을 참조하십시오. – RealSkeptic

관련 문제