2012-03-21 55 views
14

Xin chào và cảm ơn bạn đã đọc bài đăng của tôi.Biên dịch (javac) mã nguồn Java mã hóa UTF8 với BOM

Vấn đề của tôi là như sau: Tôi muốn biên dịch tệp nguồn Java bằng "javac" với tệp này được mã hóa UTF-8 bằng BOM (hệ điều hành là WinXP).

Dưới đây là những gì tôi làm:

1) Tạo một tập tin với "Notepad" và chọn bảng mã UTF-8

dos> notepad Test.java 
"File -> Save as..." 
File name : Test.java 
Save as type: All Files 
Encoding : UTF-8 
Save 

2) Tạo một lớp Java trong tập tin đó và lưu các tập tin giống như trong 1)

public class Test 
{ 
    public static void main(String [] args) 
    { 
     System.out.println("This is a test."); 
    } 
} 

3) Hình dung phiên bản hệ thập lục phân của tập tin (dòng đầu tiên)

dos> xxd Test.java | head -1 
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320 ...public class 

Lưu ý: EF BB BF là UTF-8 mã hóa BOM (BOM UTF-16 mã hóa là FE FF).

4) Cố gắng biên dịch mã này với "javac"

dos> javac -encoding utf8 Test.java 
Test.java:1: illegal character: \65279 
?public class Test 
^ 
1 error 

Lưu ý: 65.279 là phiên bản thập phân của BOM.

Câu hỏi của tôi là như sau: làm thế nào tôi có thể làm cho công việc biên soạn này với:

  • giữ nó UTF-8 mã hóa
  • và giữ BOM?

Cảm ơn bạn đã trợ giúp và chúc mừng tốt đẹp nhất.

Lea

+4

Đúng vậy: bạn phải xóa BOM. Nó không có kinh doanh trong UTF-8, do đó, tất nhiên nó là một lỗi. Đây là một lỗi Microsoft lâu đời. Không bao giờ đặt BOM vào UTF-8 !!!!! – tchrist

+0

Xin chào. Cảm ơn bạn vì câu trả lời. Tôi đã sử dụng "Notepad ++" để mã hóa tệp dưới dạng "UTF8 không có BOM". Biên dịch mã bằng "javac" hiện hoạt động. –

+3

@tchrist [Tiêu chuẩn Unicode (trang 30)] (http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf) cho phép một BOM trong UTF-8, do đó bạn có mọi quyền đưa nó vào đó nếu bạn muốn. Tại sao bạn muốn là một câu chuyện khác, nhưng 'javac' nên xử lý nó. – ArtB

Trả lời

20

Trim HĐQT và sau đó sử dụng javac -encoding utf8 x.java

14

Đây không phải là một vấn đề với soạn thảo văn bản của bạn, đó là một vấn đề với javac! Thông số Unicode cho biết BOM là tùy chọn trong UTF-8, nó không nói nó bị cấm! Nếu một BOM có thể có, sau đó javac HAS để xử lý nó, nhưng nó không. Trên thực tế, việc sử dụng BOM trong các tệp UTF-8 rất hữu ích để phân biệt tệp được mã hóa ANSI từ một tệp mã Unicode.

Giải pháp đề xuất xóa BOM chỉ là giải pháp thay thế và không phải là giải pháp phù hợp.

báo cáo lỗi này cho thấy rằng đây "vấn đề" sẽ không bao giờ được cố định: http://bugs.java.com/view_bug.do?bug_id=4508058

Kể từ chủ đề này là trong 2 kết quả google hàng đầu cho "javac BOM" tìm kiếm, tôi rời khỏi đây vào đây để độc giả tương lai .

Các vấn đề liên quan