2012-04-28 5 views
13

일부 컴파일러는 JavaDoc의 비 ASCII 문자 및 소스 코드 주석에 실패했습니다. Java 소스 파일에서 유니 코드와 관련하여 현재 (Java 7) 및 향후 (Java 8 이상) 관행은 무엇입니까? IcedTea, OpenJDK 및 기타 Java 환경간에 차이점이 있으며 언어 사양이 무엇입니까? 모든 비 ASCII 문자가 JavaDoc에서 & escape;로 이스케이프되어야합니까?- 같은 코드입니까? 그러나 Java 은 // 무엇이 좋을까요?에 해당하는 코멘트가 있습니까?javadoc 및 주석의 유니 코드?

업데이트 : 의견은 어떤 문자 집합을 사용할 수 있으며 컴파일시 원본 파일에 사용 된 문자 집합을 나타낼 필요가 있음을 나타냅니다. 이것에 대해 살펴보고 Ant, Eclipse 및 Maven을 통해 구성하는 방법에 대한 자세한 내용을 살펴볼 예정입니다.

+1

[this] (http://en.wikibooks.org/wiki/Java_Programming/Syntax/Unicode_Source) (이것이 JLS에 의해 지정되었음을 확신합니다)를보십시오. –

+5

사실, 소스 파일에서 원하는 모든 인코딩을 사용할 수 있습니다. Java 컴파일러와 javadoc 명령 줄 중 어떤 것을 선택했는지 지정하면됩니다. –

+0

OK,이 정보는 내가 찾고있는 종류입니다! 첫째, 이것은 매우 차갑고 이것을 인식하지 못했습니다. 그래서, 이제는 컴파일러가 어떻게 char set을 사용할 것인지를 결정하는 방법을 알아야합니다 ... 예를 들어, CDK는 Ant, Maven 및 Eclipse를 사용하여 컴파일됩니다. –

답변

12

일부 컴파일러의 JavaDoc 및 소스 코드 주석에 비 ASCII 문자에 실패했습니다.

이는 컴파일러가 입력이 UTF-8이라고 가정하고 소스 파일에 유효하지 않은 UTF-8 시퀀스가 ​​있기 때문일 수 있습니다. 이것들이 소스 코드 편집기에서 주석으로 표시되는 것은 관련성이 없습니다. 왜냐하면 렉서 (다른 토큰과 주석을 구별 함)가 결코 실행되지 않기 때문입니다. 도구는 렉서가 실행되기 전에 바이트를 문자로 변환하려고 시도하는 동안 오류가 발생합니다.


javacman 페이지 javadoc 그래서 당신은 당신의 원본 파일을 사용했던 인코딩 <encoding-name>를 교체 한 후 인코딩 플래그

javadoc -encoding <encoding-name> ... 

javadoc를 실행

-encoding name 
      Specifies the source file encoding name, such as 
      EUCJIS/SJIS. If this option is not specified, the plat- 
      form default converter is used. 

말 올바른 인코딩을 사용해야합니다.

함께 컴파일해야하는 소스 파일 그룹 내에 둘 이상의 인코딩이 사용 된 경우 먼저 수정해야하며 모든 원본 파일에 대해 단일 유니 코드 인코딩으로 해결해야합니다. 실제로는 UTF-8을 사용하거나 ASCII를 사용해야합니다.


자바 소스 파일에서 유니 코드와 관련하여 (자바 7) 현재와 미래 (자바 8 이후) 관행은 무엇입니까?

자바 소스 파일을 처리하기위한 알고리즘은

  1. 수집 바이트
  2. 일부를 인코딩하여 문자 (UTF-16 코드 유닛)을 바이트로 변환한다.
  3. '\\''u'의 모든 시퀀스를 그 16 진수에 해당하는 코드 단위로 4 자리 16 진수로 바꿉니다. "\u" 다음에 4 자리 16 진수가 나오지 않으면 오류가 발생합니다.
  4. 문자를 토큰에 넣습니다.
  5. 토큰을 클래스로 구문 분석하십시오.

바이트와 UTF-16 코드 단위로 변환하는 2 단계는 컴파일 단위 (소스 파일)를로드하는 도구에 달려 있지만 명령 줄 인터페이스의 사실상 표준은 -encoding 플래그를 사용하십시오.

변환이 발생하면 어휘 및 구문 분석 전에 \uABCD 스타일 시퀀스가 ​​UTF-16 코드 단위 (3 단계)로 변환되어야합니다. 예를 들어

:

int a; 
\u0061 = 42; 

자바 문 유효한 쌍이다. , 문자로하지만 구문 분석하기 전에 바이트를 변환 한 후, \ uABCD 시퀀스에 대한보고를 변환해야합니다 모든 자바 소스 코드 도구는 그래서이 코드를 분석하기 전에

int a; 
a = 42; 

로 변환됩니다. 이것은 \ uABCD 시퀀스가 ​​발생한 위치에 관계없이 발생합니다. ['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']

  • 렉스 : 유니 코드 이스케이프 교체 ['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
  • : [105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
  • 문자 바이트를 변환 :

    이 과정은

    1. 받기 바이트 같이 보입니다 ["int", "a", ";", "a", "=", "42", ";"]
    2. 구문 분석 : (Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

    모든 비 ASCII 문자를 HTML 및 이스케이프와 같은 JavaDoc에서 이스케이프 처리해야합니까?

    문서에 그대로 나타내려면 '<'과 같은 HTML 특수 문자를 제외하고는 필요하지 않습니다. javadoc 주석 안에 \uABCD 시퀀스를 사용할 수 있습니다. 소스 파일을 구문 분석하기 전에 Java 프로세스 \u....을 사용하여 문자열, 주석 등 어디에나 실제로 나타날 수 있습니다.따라서

    System.out.println("Hello, world!\u0022); 
    

    은 유효한 Java 문입니다.

    /** @return \u03b8 in radians */ 
    

    는 멀리 자바 독 관한 한

    /** @return θ in radians */ 
    

    동일하다.


    그러나 자바 // 코멘트 상응하는 어떤 것입니까?

    Java에서 // 개의 주석을 사용할 수 있지만 Javadoc은 설명서의 내용이 /**...*/ 인 경우에만 보입니다. // 덧글은 메타 데이터가 담겨 있지 않습니다. \uABCD 시퀀스의 자바의 취급

    한 분파는

    // Comment text.\u000A System.out.println("Not really comment text"); 
    

    이 한 줄의 코멘트처럼 보이는, 많은 십오 등을 강조 하겠지만, 그렇지 않은 것입니다.

  • +0

    Java 도구는 emacs/vim을 존중합니까? 인코딩에 관한 메타 데이터? – Marcin

    +0

    @Marcin, 파일의 시작 부분에'// - * - coding : UTF-8 - * -'과 같은 주석을 의미한다면, 도구는 그렇게 할 수 있지만 Sun 도구는 AFAIK하지 않습니다. –

    +0

    실망스럽게 생각합니다. 감사합니다. – Marcin

    4

    의견 작성자가 지적한대로 소스 파일의 인코딩은 (적어도 일부) 컴파일러로 전달할 수 있습니다. 이 대답에서는이 정보를 전달하는 방법을 요약 할 것입니다.

    이클립스

    이클립스 (3.7 체크) 특별한 구성이 필요하지 않습니다, 당신은 행복처럼 자바 소스 코드를 사용할 수 있습니다

    double π = Math.PI; 
    

    개미

    <javac encoding="UTF-8" ... > 
    </javac> 
    

    자바

    javac -encoding UTF-8 src/main/Foo.java