2015-02-25 1 views
1

Мне удалось создать имя узла системного предпочтения в приложении Java, работающем в Windows, которое состояло из некоторых китайских символов, а затем просмотрел реестр, чтобы проверить, и обнаружил, что jvm использует некоторую текстовую кодировку для узла имя, которое я вообще не узнал.Какая кодировка использует JVM Oracle для имен узлов предпочтений в Windows?

Все имена узлов с этими типами символов были представлены в виде строк с последовательностью, которая начиналась с «/!» (не включая кавычки), а затем включил ряд символов, которые не включены в алфавит Base64, например $% {^, хотя некоторые из них закончили с дополнениями Base64, такими как = и ==. Таким образом, он не является Base64.

Вот некоторые примеры:

/!}-!= 
/!4'6`49<"7l]`:0krpoo(8-}-#^q&8^_6 
/!f%>s>o{z5qzj.k"sy78= 

Из приведенных выше кодировок, я знаю, что это одна:

/!}-!= 

... используется для обозначения этого персонажа:

... который, в utf8, является:

0xe6 0x82 0xa0 

Я попытался подключить некоторые из этих значений (с и без ведущего /!) В uudecoder, но все они были отвергнуты как недопустимые, поэтому я не думаю, что это тоже uuencoded, хотя алфавит выглядел последовательным.

Думал, что кто-то, возможно, столкнулся с этим раньше и знал, что это за кодировка.

+2

Это модифицируется Base64, как можно видеть в конце http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/81e87652146b/src/windows/classes/java/util/prefs/WindowsPreferences.java –

ответ

1

За комментарием Олега,

Это альтернативная кодировка base64, замена прописных букв из этого алфавита со специальными символами для учета прецедентного нечувствительности в реестре Windows.

Смотрите здесь для исходного списка класса, обеспечивающей реализацию: http://www.docjar.com/html/api/java/util/prefs/Base64.java.html

Из этого списка, вот альтернативный алфавит:

/** 
    * This array is a lookup table that translates 6-bit positive integer 
    * index values into their "Alternate Base64 Alphabet" equivalents. 
    * This is NOT the real Base64 Alphabet as per in Table 1 of RFC 2045. 
    * This alternate alphabet does not use the capital letters. It is 
    * designed for use in environments where "case folding" occurs. 
    */ 
    private static final char intToAltBase64[] = { 
     '!', '"', '#', '$', '%', '&', '\'', '(', ')', ',', '-', '.', ':', 
     ';', '<', '>', '@', '[', ']', '^', '`', '_', '{', '|', '}', '~', 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '?' 
    };