2012-07-24 2 views
1

TL : DR : 자바에서는 charAt 메서드를 통해 문자열에서 얻은 문자를 바이트로 항상 같은 값을 생성합니까?

임의의 (우리에게 알려지지 않은) 문자 인코딩으로 인코딩 된 파일을 읽습니다. 이 파일을 구문 분석하고 특정 단어를 찾아야합니다 (예 : "꼬리표". 나는 "태그를 찾을 때"TAG "의 바이트가 ASCII 표현과 같아야한다는 것과 같은 파일 내용에 특정 제한을 두었습니다. 바이트를 분석하여, 내가 파일에 "태그"를 찾을 수 있습니다 T, A와 G는 각각 0x54, 0x410x47 있습니다에 대한 ASCII 값 이후
0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb
:

예를 들어, 나는 다음과 같은 파일이 있다고 가정 그들 자신.0x77 0x88 0x99 0xaa 0xbb

0x00 0x11 0x22 0x330x54 0x41 0x47
는 그러나, 나는 하드 코드 내가 찾고 있어요 바이트의 값이 필요합니다. 이렇게하려면 StringcharAt(int i) 메서드를 호출하고 char을 바이트로 캐스팅합니다.
String tag = "TAG";
char t = tag.charAt(0);
if ((byte)t == b){
                //magic goes here, such as comparing the 'A' and the 'G' :, 예를 들면, I는 'T'의 바이트 표현 (b 불림), 임의의 바이트를 확인 얼마나 여기


}
참고 : 코드가 실제로 그런 것은 아니며 확인 알고리즘이 훨씬 더 우아합니다.

내 로컬 컴퓨터에서 정상적으로 작동합니다. 그러나 이것은 매우 이상한 인코딩을 포함 할 수있는 컴퓨터에서 실행됩니다. 바이트에 charAt으로 얻은 문자를 캐스팅 할 때 기기에 따라 다른 값이 생성 될지 여부가 걱정 스럽습니다. Java가 항상 UTF-16 문자 인코딩을 사용하여 char을 인코딩한다는 것을 알고 있습니다. 그러나 String에서 문자로 변환 한 다음 바이트로 변환하면 이상한 결과가 발생할 수 있습니다.

즉, charAt 메서드를 통해 String에서 얻은 문자를 바이트로 항상 같은 값을 반환합니까? 아니면 외적 요인에 의존 할 것인가?

도움 주셔서 감사합니다.

참고 : 매우 긴 수 있으며 이후에 자주 변경 될 수 있으므로 바이트 자체 (예 : 바이트 배열)를 하드 코딩 할 수 없습니다.
Java : 문자열의 문자 값 (바이트)이 일정합니까?

+1

문자열의 charAt는 항상 16 비트 UTF-16 문자를 반환합니다.이 문자는 바이트로 캐스팅 할 때 항상 동일합니다. –

+2

인코딩을 모르는 경우 어떻게 파일을 문자열로 읽는 중입니까? –

+0

@ RogerLindsjö 파일을 String으로 읽지 않습니다. 내가 말했듯이, 나는 바이트 단위로 파일을 직접 읽고있다. 하드 코딩 된 문자열을 사용하여 해당 파일에서 무엇을 찾을 수 있는지 알 수 있습니다. –

답변

3

java.lang.string.charAt은 항상 char이 16 비트 부호없는 데이터 형식이기 때문에 항상 16 비트 UTF-16 문자를 반환합니다.이 문자는 8 비트 부호로 캐스팅합니다 byte이 원하지 않는 동작을 일으킬 수 있습니다. 그러나 원본 데이터가 ASCII 인 경우 기대하는 동작 유형을 정확하게 얻을 수 있습니다.

+0

이것은 정확합니다. 간단한 캐스트는 위험합니다. –

0

(byte)을 사용하여 char을 바이트로 변환하면 모든 시스템에서 동일한 결과가 나타납니다.

그러나 매우 희귀합니다. charbyte을 혼합해야합니다. 당신은 정말로 하나 또는 다른 것을 사용해야합니다. 개념을 혼합하면 의심되는 혼란을 겪을 수 있습니다.

2

charAt (int)은 Java 정의 char 유형 (UTF-16)을 반환하므로 항상 동일하게 casted가 byte입니다.

반대로 String.getBytes()은 지정된 charset 또는 지정되지 않은 경우 OS의 기본 charset에 따라 바이트를 반환합니다.

0

직접 입력 캐스트하는 대신 Character.codePointAt(char c) 메서드를 사용할 수 있습니다. 이렇게하면 매번 동일한 결과가 보장됩니다.