2008-10-07 61 views
10

Bất cứ khi nào tôi khởi động ứng dụng dựa trên Apache Felix (OSGi) của chúng tôi dưới SUN Java (xây dựng 1.6.0_10-rc2-b32 và các bản dựng 1.6.x khác), tôi thấy đầu ra thông báo sau trên bảng điều khiển (thường dưới Ubuntu 8.4):Mã hóa 'UTF-8' không được hỗ trợ bởi thời gian chạy Java

Cảnh báo: Mã hóa 'UTF-8' không được hỗ trợ bởi thời gian chạy Java.

Tôi đã nhìn thấy thông báo này thỉnh thoảng hiển thị khi chạy cả Tomcat và Resin. Nếu java hỗ trợ unicode và UTF-8, điều gì gây ra thông báo này? Tôi chưa tìm thấy bất kỳ tài liệu tham khảo nào hoặc trả lời câu hỏi này ở bất kỳ nơi nào khác.

+0

Strange. UTF-8 là mã hóa bắt buộc. Không ai nên phát hành một thời gian chạy Java không bao gồm UTF-8 và US-ASCII. – erickson

+0

Nó có thể là một cái gì đó thiếu trong hệ điều hành cơ bản? – skaffman

+0

Không ai nên sử dụng bản RC xây dựng trên hệ thống sản xuất :) –

Trả lời

11

Theo the documentation "Mọi triển khai nền tảng Java là bắt buộc để hỗ trợ các bộ ký tự chuẩn sau đây ... US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16. " Vì vậy, tôi nghi ngờ rằng Sun đã phát hành một bản xây dựng không có hỗ trợ UTF-8.

Thông báo lỗi thực tế xuất hiện từ here, là một phần của trình phân tích cú pháp XML Xerces. Tôi tưởng tượng nó là trình phân tích cú pháp XML, nơi xảy ra sự cố.

+3

Sự cố trong ví dụ của tôi phát sinh từ việc sử dụng OSGi và khả năng hiển thị của trình nạp lớp.Nhiều gói đã khởi tạo trình phân tích cú pháp XML Xerces, nhưng không tìm thấy các định nghĩa bộ ký tự vì các tài nguyên đó không hiển thị. –

+0

Vui lòng cung cấp các gói không hiển thị. Bạn đã có những gói nào để hiển thị? –

+2

Nếu đây là giải pháp, cách giải quyết vấn đề? Bạn có thể vui lòng chỉ định những gì bạn đã làm? Sự cố xảy ra trong Fuse ESB 4.4 trong hệ thống ghi nhật ký. –

7

Hãy thử chương trình sau đây:

import java.nio.charset.Charset; 

public class TestCharset { 
    public static void main(String[] args) { 
     System.out.println(Charset.forName("UTF-8")); 
    } 
} 

Nếu đây ném một ngoại lệ, sau đó có cái gì đó sai với JDK của bạn. Nếu nó in "UTF-8" thì JDK của bạn là OK, và ứng dụng của bạn đang làm điều gì đó kỳ quặc.

Nếu trường hợp đó xảy ra, hãy chạy ứng dụng của bạn trong trình gỡ lỗi và đặt điểm ngắt trong http://www.java2s.com/Open-Source/Java-Document/XML/xalan/org/apache/xml/serializer/ToStream.java.htm - đây là nơi cảnh báo này được tạo và bước để xem tại sao Xalan không thể tìm thấy mã hóa.

2

Có thể ai đó đặt bẫy() mong đợi chỉ có các ngoại lệ mã hóa không được hỗ trợ, vì vậy, ông đã sử dụng thông báo thích hợp. Nhưng anh ta đã sử dụng đặc tả ngoại lệ quá rộng (ví dụ: bắt (Exception ex)), vì vậy khi thời gian chạy anh ta có cái gì đó khác (XML không hợp lệ, NPE, ...) thì thông điệp trở nên gây hiểu nhầm.

0

Hãy thử một JVM khác (ổn định phát hành). Tôi đã có vấn đề này một lần và nó bật ra rằng máy đã chạy một phiên bản beta JVM mà thực sự không hỗ trợ UTF-8, trái với yêu cầu trong tài liệu API.

0

Nó phải là "UTF8", không có dấu gạch ngang.

+2

Với câu trả lời của Dan Dyer, tôi không nghĩ đây là trường hợp. Bạn đã có một tài liệu tham khảo? –

+0

Michael đúng - sắp xếp. Các nguồn JDK đã trộn lẫn các tham chiếu UTF8 và UTF-8 trong các gói NIO, NIO2 và IO thông thường khác nhau. Khá khủng khiếp thực sự. –

0

Nếu bạn đang nhận được thông báo này khi sử dụng một biến áp, cố gắng để xác định TransformerFactory:

link

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