2014-04-10 21 views
10

Tôi đã làm việc với chức năng java.util.prefs.Preferences (trong Java 8, trên máy Windows). Và nó hoạt động, nơi tôi có thể viết các khóa mới cho Windows Registry. Vì vậy, tôi sử dụng Preferences.systemRoot() để lấy đối tượng Preferences cho hệ thống, và sau đó sử dụng phương thức node() để lấy một đối tượng Preferences ánh xạ tới một nút trong Windows Registry. Và nó tạo ra những điều tốt đẹp.Trong Java, tại sao WindowsPreferences sử dụng dấu gạch chéo cho chữ hoa?

Khoá tôi đang sử dụng cho nút là một chuỗi trong tất cả các chữ cái viết hoa ("RBI"). Khi tôi nhìn vào nút trong Windows Registry, nó xuất hiện dưới dạng "/ R/B/I", với dấu gạch chéo ở phía trước trong tên.

Tôi nghĩ điều này thật kỳ quặc, vì vậy tôi đã đào xới một chút Và có vẻ như đây là chủ ý. Tôi đã tìm thấy lớp cung cấp việc triển khai Preferences trên môi trường Windows (java.util.prefs.WindowsPreferences) và phương thức được sử dụng để xây dựng các giá trị được gửi tới cửa sổ đăng ký là một phương thức tĩnh toWindowsName. Trong javadoc cho rằng ....

/** 
* Converts value's or node's name to its Windows representation 
* as a byte-encoded string. 
* Two encodings, simple and altBase64 are used. 
* <p> 
* <i>Simple</i> encoding is used, if java string does not contain 
* any characters less, than 0x0020, or greater, than 0x007f. 
* Simple encoding adds "/" character to capital letters, i.e. 
* "A" is encoded as "/A". Character '\' is encoded as '//', 
* '/' is encoded as '\'. 
* The constructed string is converted to byte array by truncating the 
* highest byte and adding the terminating <tt>null</tt> character. 
* <p> 
* <i>altBase64</i> encoding is used, if java string does contain at least 
* one character less, than 0x0020, or greater, than 0x007f. 
* This encoding is marked by setting first two bytes of the 
* Windows string to '/!'. The java name is then encoded using 
* byteArrayToAltBase64() method from 
* Base64 class. 
*/ 

Vì vậy, các mã hóa đơn giản sẽ, đối với chữ in hoa, thêm một dấu gạch chéo.

Có ai biết tại sao điều này là bắt buộc không? Tôi đã nghĩ rằng Registry có thể xử lý các giá trị phân biệt chữ hoa chữ thường, nhưng điều này dường như chỉ ra rằng nó không thể?

Tôi có thể giải quyết vấn đề này, tôi chỉ tò mò tại sao điều này được thực hiện.

+0

Có vẻ như họ đang cố gắng làm cho lược đồ đặt tên phân biệt chữ hoa chữ thường. –

+0

Đồng ý, nhưng bằng cách sử dụng RegEdit tôi có thể nhập trường hợp chuỗi nhạy cảm (có rất nhiều người trong số họ đã có). Và sử dụng các công cụ khác mà tùy chọn đã có. Có lẽ nó là một số cách giải quyết với các cuộc gọi vào các phương pháp bản địa cuối cùng đang được sử dụng. – EdH

+0

Dường như mã hóa chuỗi là một mảng byte. Mà là tốt. Bây giờ, lý do duy nhất tôi có thể nghĩ đến (bốn từ cuối cùng là chìa khóa) làm việc này sẽ là nếu bạn không có các giá trị byte khác nhau cho chữ thường và chữ thường. Nhưng, một lần nữa, theo như tôi biết, chữ thường và chữ hoa có giá trị byte khác nhau. Vì vậy, nó không thực sự cần thiết? Tôi phải thiếu một cái gì đó – EdH

Trả lời

11

Tôi rất tò mò khi bạn và tôi đã tìm thấy giải thích sau:

Khóa-đăng ký bảo vệ trường hợp, nhưng không phân biệt chữ hoa chữ thường. Ví dụ: nếu bạn có khóa "Rbi", bạn không thể tạo khóa khác có tên "RBi". Trường hợp được lưu nhưng bị bỏ qua. Giải pháp của Sun đối với trường hợp nhạy cảm là thêm dấu gạch chéo vào khóa.

Giá trị-đăng ký phân biệt chữ hoa chữ thường (và dĩ nhiên là bảo toàn trường hợp). Tôi không nghĩ đó là ý định của Sun để thêm các dấu gạch chéo vào các giá trị, nhưng bằng cách nào đó nó trượt vào mã. Dường như với tôi, lỗi này không được tìm thấy trong một thời gian dài. Khi lỗi được phát hiện, nhiều hệ thống đã phụ thuộc vào việc triển khai sai, vì vậy chúng không bao giờ loại bỏ nó để duy trì khả năng tương thích.

Nếu bạn không thích các dấu gạch chéo trong Giá trị đăng ký của mình, bạn có thể quan tâm đến this implementation.

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