2012-04-28 32 views
13

Một số trình biên dịch không thành công trên các ký tự không phải ASCII trong JavaDoc và các bình luận mã nguồn. Các thực hành hiện tại (Java 7) và tương lai (Java 8 và hơn thế nữa) đối với Unicode trong các tệp nguồn Java là gì? Có sự khác biệt nào giữa IcedTea, OpenJDK và các môi trường Java khác, và những gì được quyết định đặc tả ngôn ngữ? Tất cả các ký tự không phải ASCII sẽ được thoát trong JavaDoc với HTML và thoát; -như mã? Nhưng điều gì sẽ là Java // bình luận tương đương?Unicode trong javadoc và nhận xét?

Cập nhật: nhận xét chỉ ra rằng người dùng có thể sử dụng bất kỳ bộ ký tự nào và khi biên dịch cần chỉ ra bộ char được sử dụng trong tệp nguồn. Tôi sẽ xem xét điều này và sẽ tìm kiếm các chi tiết về cách cấu hình điều này thông qua Ant, Eclipse và Maven.

+1

Hãy xem [this] (http://en.wikibooks.org/wiki/Java_Programming/Syntax/Unicode_Source) (Tôi chắc chắn điều này được chỉ định bởi JLS). –

+5

Trên thực tế, bạn có thể sử dụng bất kỳ mã hóa nào bạn muốn trong các tệp nguồn của mình, bạn chỉ cần cho biết bạn đã chọn trình biên dịch Java nào và dòng lệnh javadoc. –

+0

OK, đây là loại thông tin tôi đang tìm kiếm! Đầu tiên, điều này rất hay và không nhận thức được điều này. Vì vậy, bây giờ tôi chỉ cần tìm hiểu làm thế nào để có được trình biên dịch để biết char thiết lập để sử dụng ... ví dụ, CDK được biên dịch bằng cách sử dụng Ant, Maven, và Eclipse ... –

Trả lời

12

Một số trình biên dịch không thành công trên các ký tự ASCII trong javadoc và mã nguồn ý kiến.

Điều này có thể do trình biên dịch giả định rằng đầu vào là UTF-8 và có chuỗi UTF-8 không hợp lệ trong tệp nguồn. Điều đó dường như trong các bình luận trong trình soạn thảo mã nguồn của bạn là không liên quan bởi vì lexer (phân biệt ý kiến ​​từ các mã thông báo khác) không bao giờ được chạy. Sự thất bại xảy ra trong khi công cụ đang cố gắng chuyển đổi byte thành ký tự trước khi lexer chạy.


Các man trang cho javacjavadoc nói

-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. 

để chạy javadoc với cờ mã hóa

javadoc -encoding <encoding-name> ... 

sau khi thay <encoding-name> với mã hóa bạn đã sử dụng cho các tập tin nguồn của bạn nên làm cho nó sử dụng mã hóa đúng.

Nếu bạn có nhiều mã hóa được sử dụng trong nhóm tệp nguồn mà bạn cần biên dịch cùng nhau, bạn cần phải sửa mã đó trước và giải quyết trên một mã hóa đơn nhất cho tất cả các tệp nguồn. Bạn thực sự chỉ nên sử dụng UTF-8 hoặc dính vào ASCII.


là gì hiện tại (Java 7) và tương lai (Java 8 và hơn thế nữa) hoạt động liên quan đến Unicode trong các tập tin nguồn Java với?

Thuật toán để đối phó với một tập tin nguồn trong Java là

  1. Thu thập byte
  2. Chuyển byte thành chars (UTF-16 đơn vị code) sử dụng một số mã hóa.
  3. Thay thế tất cả các dãy của '\\''u' theo sau là bốn chữ số thập phân với đơn vị mã tương ứng với các chữ số hex đó. Lỗi nếu có "\u" không được theo sau bởi bốn chữ số thập phân.
  4. Lex các ký tự thành các thẻ.
  5. Phân tích cú pháp các thẻ vào các lớp học.

Thực tiễn hiện tại và trước đây là bước 2, chuyển đổi byte sang đơn vị mã UTF-16, tùy thuộc vào công cụ đang tải đơn vị biên dịch (tệp nguồn) nhưng chuẩn thực tế cho giao diện dòng lệnh là sử dụng cờ -encoding.

Sau khi chuyển đổi đó xảy ra, ngôn ngữ yêu cầu rằng \uABCD trình tự kiểu được chuyển đổi thành đơn vị mã UTF-16 (bước 3) trước khi lexing và phân tích cú pháp.

Ví dụ:

int a; 
\u0061 = 42; 

là một cặp giá trị của báo cáo Java. Bất kỳ java mã nguồn công cụ phải, sau khi chuyển đổi byte để chars nhưng trước khi phân tích, tìm kiếm chuỗi \ uABCD và chuyển đổi chúng do đó, mã này được chuyển thành

int a; 
a = 42; 

trước khi phân tích cú pháp. Điều này xảy ra bất kể trình tự \ uABCD xuất hiện ở đâu.

Quá trình này trông giống như

  1. byte Nhận: [105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
  2. Chuyển byte thành chars: ['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
  3. Thay unicode thoát: ['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
  4. Lex: ["int", "a", ";", "a", "=", "42", ";"]
  5. Parse: (Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

Tất cả các ký tự không phải ASCII sẽ được thoát trong JavaDoc với mã HTML và thoát;

Không cần ngoại trừ các ký tự đặc biệt HTML như '<' mà bạn muốn xuất hiện theo nghĩa đen trong tài liệu. Bạn có thể sử dụng các chuỗi \uABCD bên trong nhận xét javadoc. Quy trình Java \u.... trước khi phân tích cú pháp tệp nguồn để chúng có thể xuất hiện bên trong chuỗi, nhận xét, ở bất kỳ đâu.Đó là lý do tại sao

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

là một câu lệnh Java hợp lệ.

/** @return \u03b8 in radians */ 

tương đương với

/** @return θ in radians */ 

như xa như javadoc là có liên quan.


Nhưng điều gì sẽ là Java // bình luận tương đương?

Bạn có thể sử dụng // nhận xét bằng java nhưng Javadoc chỉ xem xét bên trong /**...*/ nhận xét cho tài liệu. // nhận xét không phải là siêu dữ liệu.

Một nhánh của xử lý \uABCD chuỗi Java là mặc dù

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

trông giống như một bình luận dòng duy nhất, và nhiều IDE sẽ làm nổi bật nó như vậy, nó không phải là.

+0

Các công cụ java sẽ tôn trọng emacs/vim siêu dữ liệu về mã hóa? – Marcin

+0

@Marcin, nếu bạn có nghĩa là một chú thích như '// - * - mã hóa: UTF-8 - * -' ở đầu tệp, một công cụ có thể chọn để làm như vậy, nhưng các công cụ Mặt trời không AFAIK. –

+0

Thất vọng, cảm ơn. – Marcin

4

Khi người nhận xét cho biết, việc mã hóa các tệp nguồn có thể được chuyển đến (ít nhất một số) trình biên dịch. Trong câu trả lời này, tôi sẽ tóm tắt cách chuyển thông tin này.

Eclipse

Eclipse (3.7 kiểm tra) không yêu cầu bất kỳ cấu hình đặc biệt, và bạn hạnh phúc có thể sử dụng mã nguồn Java như:

double π = Math.PI; 

Ant

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

Java

javac -encoding UTF-8 src/main/Foo.java 
Các vấn đề liên quan