TL : DR : 자바에서는 charAt
메서드를 통해 문자열에서 얻은 문자를 바이트로 항상 같은 값을 생성합니까?
임의의 (우리에게 알려지지 않은) 문자 인코딩으로 인코딩 된 파일을 읽습니다. 이 파일을 구문 분석하고 특정 단어를 찾아야합니다 (예 : "꼬리표". 나는 "태그를 찾을 때"TAG "의 바이트가 ASCII 표현과 같아야한다는 것과 같은 파일 내용에 특정 제한을 두었습니다. 바이트를 분석하여, 내가 파일에 "태그"를 찾을 수 있습니다 T, A와 G는 각각 0x54
, 0x41
및 0x47
있습니다에 대한 ASCII 값 이후
0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb
:
예를 들어, 나는 다음과 같은 파일이 있다고 가정 그들 자신.0x77 0x88 0x99 0xaa 0xbb
0x00 0x11 0x22 0x33
0x54 0x41 0x47
는 그러나, 나는 하드 코드 내가 찾고 있어요 바이트의 값이 필요합니다. 이렇게하려면 String
의 charAt(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 : 문자열의 문자 값 (바이트)이 일정합니까?
답변
java.lang.string.charAt
은 항상 char
이 16 비트 부호없는 데이터 형식이기 때문에 항상 16 비트 UTF-16 문자를 반환합니다.이 문자는 8 비트 부호로 캐스팅합니다 byte
이 원하지 않는 동작을 일으킬 수 있습니다. 그러나 원본 데이터가 ASCII 인 경우 기대하는 동작 유형을 정확하게 얻을 수 있습니다.
이것은 정확합니다. 간단한 캐스트는 위험합니다. –
(byte)
을 사용하여 char을 바이트로 변환하면 모든 시스템에서 동일한 결과가 나타납니다.
그러나 매우 희귀합니다. char
과 byte
을 혼합해야합니다. 당신은 정말로 하나 또는 다른 것을 사용해야합니다. 개념을 혼합하면 의심되는 혼란을 겪을 수 있습니다.
예 charAt (int)
은 Java 정의 char 유형 (UTF-16)을 반환하므로 항상 동일하게 casted가 byte
입니다.
반대로 String.getBytes()
은 지정된 charset 또는 지정되지 않은 경우 OS의 기본 charset에 따라 바이트를 반환합니다.
직접 입력 캐스트하는 대신 Character.codePointAt(char c)
메서드를 사용할 수 있습니다. 이렇게하면 매번 동일한 결과가 보장됩니다.
- 1. 문자열의 문자 수를 계산하는 Java 메소드
- 2. 이스케이프 = 자바 문자열의 문자
- 3. 문자열의 문자 수 표시
- 4. php로 문자 메시지를 보낼 수있는 "전화 번호"값이 일정합니까?
- 5. 문자열의 마지막 문자 교체
- 6. 문자열의 마지막 문자 제거
- 7. 문자열의 문자 바꾸기 iPhone
- 8. 표준 : : 문자열의 문자 참조
- 9. 문자열의 특수 문자 수정
- 10. 문자열의 최대 문자 수
- 11. xslt 문자열의 특수 문자
- 12. 문자열의 잘못된 문자 바꾸기
- 13. 루아에서 문자열의 문자 수정하기
- 14. 문자열의 문자 수
- 15. 문자열의 모든 문자 바꾸기
- 16. 문자열의 문자 바꾸기
- 17. 문자열의 반복 문자 테스트
- 18. 문자열의 문자 바꾸기
- 19. MSBuild에서 문자열의 문자 카운트를
- 20. 문자열의 중간에서 문자 교체
- 21. 문자열의 16 진수 문자
- 22. Ada에서 문자열의 문자 찾기
- 23. 문자열의 문자 교체 비용은?
- 24. C에서 문자열의 문자 바꾸기
- 25. 문자열의 문자 집합 검색
- 26. 문자열의 문자 비교 알고리즘
- 27. Ruby에서 문자열의 문자 찾기
- 28. 문자열의 문자 포함을 확인하십시오.
- 29. Java getNumericValue()로 문자 리터럴 값
- 30. 문자열의 파이썬 분할 값
문자열의 charAt는 항상 16 비트 UTF-16 문자를 반환합니다.이 문자는 바이트로 캐스팅 할 때 항상 동일합니다. –
인코딩을 모르는 경우 어떻게 파일을 문자열로 읽는 중입니까? –
@ RogerLindsjö 파일을 String으로 읽지 않습니다. 내가 말했듯이, 나는 바이트 단위로 파일을 직접 읽고있다. 하드 코딩 된 문자열을 사용하여 해당 파일에서 무엇을 찾을 수 있는지 알 수 있습니다. –