当前位置: 首页 > 面试题库 >

在Java中,为什么WindowsPreferences将斜杠用于大写字母?

彭正谊
2023-03-14
问题内容

我一直在使用java.util.prefs.Preferences功能(在Windows计算机上的Java
8中)。它可以正常工作,在这里我可以将新密钥写入Windows注册表。因此,我使用Preferences.systemRoot()获取系统的Preferences对象,然后使用node()方法获取映射到Windows注册表中节点的Preferences对象。而且它正在创造一切。

我用于节点的密钥是所有大写字母(“ RBI”)中的字符串。当我查看Windows注册表中的节点时,它显示为“ / R / B / I”,名称中带有正斜杠。

我以为这很奇怪,所以我挖了一下,看来这是故意的。我发现提供在Windows环境上实现Preferences的类的类(java.util.prefs.WindowsPreferences),该方法用于构建发送到Windows注册表的值,它是toWindowsName的静态方法。在JavaDoc中…

/**
 * Converts value's or node's name to its Windows representathtml" target="_blank">ion
 * 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.
*/

因此,对于大写字母,简单编码将添加一个正斜杠。

有人知道为什么这样做吗?我以为注册表可以处理区分大小写的值,但这似乎表明它不能?

我可以解决这个问题,我很好奇为什么要这么做。


问题答案:

当您感到好奇时,我发现了以下解释:

注册表项保留大小写,但不区分大小写。例如,如果您有钥匙“ Rbi”,则无法创建另一个名为“
RBi”的钥匙。案例已保存但被忽略。Sun区分大小写的解决方案是在密钥中添加斜线。

注册表值区分大小写(当然,也区分大小写)。我不认为Sun也打算将斜杠添加到值中,但不知何故,它就滑入了代码中。在我看来,这个错误已久未找到。发现该错误后,许多系统已经依赖于错误的实现,因此他们从不删除它来保持兼容性。

如果您不喜欢注册表值中的斜线,则可能对此实现感兴趣。



 类似资料:
  • 问题内容: 我正在将CSV文件导入MySQL数据库。可以通过支持文件路径中的正斜杠来实现。如果用户给出路径 MySQL不支持这种类型的路径模式。我想在路径中搜索反斜杠并将其替换为正斜杠,以实现以下目的: 怎么做? 问题答案: 在Java中,使用以下命令: 注意,这里不需要replace的正则表达式版本,即;仍会替换所有出现的搜索词,但会搜索 文字 字符串,而不是正则表达式匹配项。

  • 问题内容: 这样做的原因是“逃脱了”我。 JSON转义为正斜杠,因此哈希序列化为而不是。 为什么? 问题答案: JSON不需要您执行此操作,而是允许您执行此操作。它还允许您将“ \ u0061”用于“ A”,但这不是必需的。在将JSON嵌入标记中时允许帮助,该标记不允许内部字符串出现,如Seb指出的那样。 Microsoft的一些ASP.NET Ajax / JSON API使用此漏洞来添加额外的

  • 问题内容: 我已经使用了很长时间了,到目前为止我还没有遇到任何问题。现在,我正在使用上传脚本,并且尝试在文件上传后返回一些JSON数据。 我有以下代码: 这给了我以下结果: 谁能告诉我为什么加斜杠? 更新 @Quentin说,事情是发生之间和与他的权利。 做一个给我以下结果: 这不是有效的JSON。它还添加,我不知道它来自哪里。 可能对我返回的数据有影响吗? 这是我的js脚本: 问题答案: 谁能告

  • 问题内容: python中反斜杠b的用途是什么,我在python解释器中运行了 打印“ \” foo \ bar” ,并得到以下结果: 问题答案: 请参阅字符串文字文档: ASCII退格键(BS) 它产生一个 退格字符 。打印该字符时,终端会在第二秒上退格。

  • 问题内容: json.org指出,可以将正斜杠(也称为solidus,)转义: 但是,未转义的斜杠也有效: 这背后的原因是什么?它来自Javascript根吗?(即,这是基于浏览器的Javascript中的问题,请参见Douglas Crockford的评论 )还是其他原因? 问题答案: 看来,我的第一个想法是正确的。 在JavaScript中,JSON 几乎 是 有效的JavaScript。但是