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', '+', '?'
};
我碰巧在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', '+', '?'
};