Oracle jvm 在 Windows 上对首选项节点名称使用什么编码?

What encoding does the Oracle jvm use for preference node names on Windows?

我碰巧在Windows上的一个Java应用程序运行中创建了一个由一些汉字组成的系统偏好节点名称,然后查看了注册表以验证,并发现 jvm 对我根本不认识的节点名称使用了一些基于文本的编码。

所有具有这些字符的节点名称都表示为具有以“/!”开头的序列的字符串。 (不包括引号),然后包含一些不包含在 Base64 字母表中的字符,如 $ % { ^,尽管其中一些确实以 Base64 填充序列结尾,如 = 和 ==。所以,它似乎不是 Base64。

这里有一些例子:

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

以上编码中,我知道的是这个:

/!}-!=

...用来表示这个字符:

...在 utf8 中是:

0xe6 0x82 0xa0

我尝试将其中一些值(有和没有前导 /!)插入 uudecoder,但它们都被认为无效而被拒绝,所以我也不认为它是 uuencoded,尽管字母表看起来是一致的。

以为有人以前可能遇到过这个并且知道这个编码是什么。

根据 Oleg 的评论,

这是另一种 base64 编码,用特殊字符替换该字母表中的大写字母,以解决 Windows 注册表中不区分大小写的问题。

请在此处查看提供实施的 class 的源列表: 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', '+', '?'
   };