2012-04-11 30 views
6

Tôi đang chạy một ứng dụng Java nhỏ trên nền tảng Linux nhúng. Sau khi thay thế Java VM JamVM bằng OpenJDK, tên tệp có các ký tự đặc biệt không được lưu trữ chính xác. Các ký tự đặc biệt như umlauts được thay thế bằng dấu chấm hỏi.Mã hóa tên tệp trong Java

Đây là mã thử nghiệm của tôi:

import java.io.File; 
import java.io.IOException; 

public class FilenameEncoding 
{ 

     public static void main (String[] args) { 
       String name = "umlaute-äöü"; 
       System.out.println("\nname = " + name); 
       System.out.print("name in Bytes: "); 
       for (byte b : name.getBytes()) { 
         System.out.print(Integer.toHexString(b & 255) + " "); 
       } 
       System.out.println(); 

       try { 
         File f = new File(name); 
         f.createNewFile(); 
       } catch (IOException e) { 
         e.printStackTrace(); 
       } 
     } 

} 

Chạy nó mang lại kết quả như sau:

name = umlaute-??? 
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 

và tập tin gọi là umlaute - ??? được tạo ra.

Đặt tệp thuộc tính.encoding và sun.jnu.encoding thành UTF-8 cung cấp các chuỗi chính xác trong thiết bị đầu cuối, nhưng tệp được tạo vẫn là umlaute - ???

Chạy máy ảo với strace, tôi có thể thấy các cuộc gọi hệ thống

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4 

Điều này cho thấy, rằng vấn đề không phải là một vấn đề hệ thống tập tin, nhưng một trong những VM.

Làm cách nào để mã hóa tên tệp được đặt?

+0

Hãy đi qua các liên kết để giải thích cách thiết lập mã hóa .. http://stackoverflow.com/questio ns/361975/setting-the-default-java-character-encoding – Phani

+0

Cài đặt file.encoding không có tác dụng. Nó chỉ ảnh hưởng đến nội dung tập tin, nhưng không ảnh hưởng đến tên tập tin. –

+0

Điều này có thể giúp bạn một chút .. http://stackoverflow.com/questions/1184176/how-can-i-safely-encode-a-string-in-java-to-use-as-a-filename – Phani

Trả lời

3

Nếu bạn đang sử dụng Eclipse, bạn có thể vào Window-> Preferences-> General-> Workspace và chọn tùy chọn "Text file encoding" mà bạn muốn từ trình đơn kéo xuống. Bằng cách thay đổi của tôi xung quanh, tôi đã có thể tái tạo vấn đề của bạn (và cũng có thể thay đổi trở lại bản sửa lỗi).

Nếu không, bạn có thể thêm biến môi trường vào cửa sổ (Thuộc tính hệ thống-> Biến môi trường và dưới biến hệ thống bạn muốn chọn Mới ...) Tên phải là (không có dấu ngoặc kép) JAVA_TOOL_OPTIONS và giá trị . nên được đặt thành -Dfile.encoding=UTF8 (hoặc bất kỳ mã hóa sẽ nhận được của bạn để làm việc

tôi tìm thấy câu trả lời thông qua bài viết này, btw: Setting the default Java character encoding?

Linux Giải pháp

- (Vĩnh viễn) Sử dụng env | grep LANG trong thiết bị đầu cuối sẽ cung cấp cho bạn một hoặc hai phản hồi về những gì mã hóa linux hiện đang được thiết lập với. Sau đó bạn có thể thiết lập LANG thành UTF8 (bạn có thể được đặt thành ASCII) trong tập tin /18/sysconfig i18n (tôi đã thử nghiệm điều này trên 2.6.40 fedora). Về cơ bản, tôi chuyển từ UTF8 (nơi tôi có các ký tự lẻ) thành ASCII (nơi tôi có dấu hỏi) và ngược lại.

- (khi chạy JVM, nhưng có thể không khắc phục được sự cố) Bạn có thể khởi động JVM bằng mã hóa bạn muốn bằng java -Dfile.encoding = **** FilenameEncoding Đây là đầu ra từ hai cách:

[[email protected] bin]$ java -Dfile.encoding=UTF8 FilenameEncoding 

name = umlaute-הצ� 
name in Bytes: 75 6d 6c 61 75 74 65 2d d7 94 d7 a6 ef bf bd 
UTF-8 
UTF8 

[[email protected] bin]$ java FilenameEncoding 

name = umlaute-??????? 
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 3f 3f 3f 3f 
US-ASCII 
ASCII 

Dưới đây là một số tài liệu tham khảo cho những thứ linux http://www.cyberciti.biz/faq/set-environment-variable-linux/

và đây là một trong về -Dfile.encoding Setting the default Java character encoding?

+0

Tôi đã kiểm tra mã hóa tên tệp trong tệp .class-File đã biên dịch. Có nó là chính xác. Cùng một .class-File hoạt động trên Linux của máy tính để bàn, nhưng không hoạt động trên Linux. –

+0

bạn có thể cung cấp thêm thông tin về Linux bạn đang sử dụng không? Ý tưởng là như nhau, bạn chỉ cần thích ứng nó với chương trình/HĐH khởi động JVM. –

+0

Đây là hạt nhân 2.6.30 chạy trên bộ xử lý ARM v5 (Atmel AT91SAM9G20). Một điều thú vị là JamVM có thể xử lý các tên tệp như vậy, nhưng OpenJDK thì không. OpenJDK phụ thuộc vào những tính năng hệ điều hành nào? –

0

Vấn đề của bạn là javac đang mong đợi một mã hóa khác cho .java -file của bạn hơn bạn đã lưu nó thành. Không javac cảnh báo bạn khi bạn biên dịch?

Có thể bạn đã lưu bằng mã hóa ISO-8859-1 hoặc windows-1252javac đang mong đợi UTF-8.

Cung cấp mã hóa chính xác cho javac với cờ -encoding hoặc tương đương với công cụ xây dựng của bạn.

0

Tôi biết đó là một câu hỏi cũ nhưng tôi có cùng một vấn đề. Tất cả các giải pháp được nêu không làm việc cho tôi, nhưng sau đây giải quyết nó: mã hóa

  • Nguồn để UTF8 (project.build.sourceEncoding để UTF8 trong tính maven)
  • lập luận Chương trình: -Dfile .encoding = utf8 và -Dsun.jnu.encoding = utf8
  • Sử dụng java.nio.file.Path thay vì java.io.File