Java 소스 코드에서 일부 ASCII 문자를 '\ uXXXX'형식으로 표현할 수없는 이유는 무엇입니까?
나는 오늘 (다시) 이것을 우연히 발견했습니다.
class Test {
char ok = '\n';
char okAsWell = '\u000B';
char error = '\u000A';
}
조제되지 않았습니다.
4 행에 잘못된 문자 상수가 있습니다.
컴파일러는 대신 '\ n'을 작성한다고 주장하는 것입니다. 나는 이것에 대한 이유를 알지 못하지만 매우 성가신 일입니다.
특수 표기법 (예 \t
: \n
,, \r
) 이있는 문자가 Java 소스에서 해당 형식으로 표현 되어야 하는 이유에 대한 유동적 인 설명이 있습니까?
유니 코드 문자는 해당 값으로 대체 컴파일러는 다음과 같이 라인을 대체합니다.
char error = '
';
유효한 Java 문이 아닙니다.
이것은 언어 사양 에 의해 결정 됩니다.
Java 프로그래밍 언어 용 컴파일러 ( "Java 컴파일러")는 먼저 입력에서 유니 코드 이스케이프를 인식하여 ASCII 문자 \ u 다음에 4 자리 16 진수를 16 진수 값의 UTF-16 코드 단위 (§3.1)로 변환합니다. 다른 모든 문자를 변경하지 않고 전달합니다. 보충 문자를 표시하는 두 개의 연속 유니 코드 이스케이프가 필요합니다. 이 변환 단계는 생성의 유니 코드 입력 문자를 생성합니다.
예를 들어 유효한 Java 프로그램 (숨겨진 유니 코드 문자 포함)입니다.- Peter Lawrey 제공 :
public static void main(String[] args) {
for (char ch = 0; ch < Character.MAX_VALUE; ch++) {
if (Character.isJavaIdentifierPart(ch) && !Character.isJavaIdentifierStart(ch)) {
System.out.printf("%04x <%s>%n", (int) ch, "" + ch);
}
}
}
같은 유니 코드 이스케이프 시퀀스\u000a
는 Java 컴파일러가 소스 코드로 다른 작업을 수행하기 전에 실제 문자 작업으로 대체 됩니다. 결국 프로그램은 결국
char ch = '
';
따라서
\u000a
소스 코드는 내부적으로 줄 바꿈 문자로 대체됩니다. 이것은 해석하기 전에 실제로 소스 코드를 발생합니다.
Java 언어 사양 참조 :
줄 종결 자 (§3.4)가 여는 '앞에 내리고 타임 오류입니다 .
그리고 모두가 잘 알고 \n
있는 것은 줄 종결 자입니다 .
LineTerminator:
the ASCII LF character, also known as "newline"
the ASCII CR character, also known as "return"
the ASCII CR character followed by the ASCII LF character
문제를 많은 수있는 다른 기호는 \
, '
및 "
예입니다.
그 이유는 \uXXXX
코드가 구문 분석 될 때 시퀀스가 확장되기 때문이라고 생각합니다 ( JLS §3.2 참조) . 어휘 번역 .
3.3에 설명되어 있습니다. 유니 코드 이스케이프 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html . Javac는 먼저 .java에서 \ uxxxx 시퀀스를 찾아 실제 문자로 바꾼 다음을 찾습니다. 의 경우
char error = '\u000A';
\ u000A는 newline
문자 코드 (10) 로 대체되고 실제 텍스트는
char error = '
';
컴파일러는 이들을 이스케이프되지 않은 텍스트와 동일하게 취급하기 때문입니다.
이것은 유효한 코드입니다.
class \u00C9 {}
'ProgramingTip' 카테고리의 다른 글
xcode에서 메서드 드롭 다운을 여는 바로 가기 (0) | 2020.12.15 |
---|---|
Java Import 오기는 어떻게 작동합니까? (0) | 2020.12.15 |
어디에서나 BigDecimal로 어떻게 구문 분석을 수행 할 수 있습니까? (0) | 2020.12.15 |
pm2 오류 로그에 날짜를 추가하는 방법은 무엇입니까? (0) | 2020.12.15 |
Python에서 HDF5 파일을 읽는 방법 (0) | 2020.12.15 |