<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/doc/base/misc/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/doc/base/misc/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/doc/base/misc/properties/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/base/misc/properties/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introproperties">
 Intro(PROPERTIES)
 &lt;a class="anchor" href="#introproperties">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="systemproperties">
 System.properties()
 &lt;a class="anchor" href="#systemproperties">#&lt;/a>
&lt;/h3>
&lt;p class="warn">在&lt;code>System&lt;/code>类中有 &lt;strong>initProperties(Properties props);&lt;/strong> native 方法。在C代码


 &lt;a href="https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/native/java/lang/System.c#L172" rel="noopener" target="_blank">&lt;code>GetJavaProperties(env);&lt;/code>&lt;/a>中会获取到一些props。这个方法的实现在


 &lt;a href="https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/solaris/native/java/lang/java_props_md.c#L427" rel="noopener" target="_blank">java_props_md.c&lt;/a>中。在 626 行&lt;code>setProxyProperties(&amp;amp;sprops);&lt;/code> 会进行系统代理的设置。继续调用到


 &lt;a href="https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/solaris/native/java/lang/java_props_macosx.c#L290" rel="noopener" target="_blank">java_props_maxosx.c&lt;/a>中。主要会使用 macosx SDK 中的 


 &lt;a href="https://developer.apple.com/documentation/systemconfiguration/1517088-scdynamicstorecopyproxies" rel="noopener" target="_blank">&lt;code>SCDynamicStoreCopyProxies(_:)&lt;/code>&lt;/a>


 &lt;a href="https://github.com/12302-bak/practise-demo/blob/master/main.c#L14" rel="noopener" target="_blank">【函数调用 C Demo】&lt;/a>， 获取当前系统中的网络代理设置。&lt;span style='color: red'>需要注意与环境变量进行区分。&lt;/span>&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="prop对unicode编码的处理">
 Prop对unicode编码的处理
 &lt;a class="anchor" href="#prop%e5%af%b9unicode%e7%bc%96%e7%a0%81%e7%9a%84%e5%a4%84%e7%90%86">#&lt;/a>
&lt;/h3>
&lt;p class="warn">在查看 &lt;strong>Spring国际化(i18n)&lt;/strong> 和 &lt;strong>ResourceBundle&lt;/strong> 相关的代码的时候，发现都会用到&lt;code>Properties&lt;/code>类相关的处理。而且对于 &lt;strong>unicode&lt;/strong> 的处理都是由这个类去自动处理的。所以跟踪了相关代码，对这部分做一个记录。
&lt;br>&lt;br>大概的原理是：
&lt;br>&lt;code>1).&lt;/code> 在 


 &lt;a href="https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/util/Properties.java#L344" rel="noopener" target="_blank">java.util.Properties#load0&lt;/a> 读取每一行，通过&lt;code>=&lt;/code>、&lt;code>:&lt;/code> 分割每一个key和value。在最后对key和value分别进行转换。
&lt;br>&lt;code>2).&lt;/code> 调用 


 &lt;a href="https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/util/Properties.java#L538C20-L538C31" rel="noopener" target="_blank">java.util.Properties#loadConvert&lt;/a> 进行转换操作。转换过程：碰见&lt;code>\u&lt;/code>将后面的四位使用算法转换成十进制数字，当成一个char类型的字符。在原来的数组上面进行覆盖。&lt;/p>
&lt;p>&lt;strong>相关算法如下图：&lt;/strong>&lt;/p>
&lt;div class="alert callout attention">&lt;p class="title">&lt;span class="icon icon icon-attention">&lt;/span> Caution &lt;/p>&lt;p> 比如将&lt;code>\u4f60&lt;/code>转成字符char&lt;code>20320&lt;/code>. 过程如下：
&lt;br>&lt;br>第一个字符&lt;code>'4'&lt;/code>，进到循环后，执行&lt;code>(value &amp;lt;&amp;lt; 4) + aChar - '0';&lt;/code> 此时 value = 0，左移四位还是0 ，再加上字符&lt;code>'4'&lt;/code>表示的整型值 &lt;strong>4&lt;/strong> (正好是当前字符&lt;code>'4'&lt;/code>与&lt;code>'0'&lt;/code>字符的差值) 最后value = &lt;code>0100&lt;/code>;
&lt;br>第二个字符&lt;code>'f'&lt;/code>，进来后执行&lt;code>(value &amp;lt;&amp;lt; 4) + 10 + aChar - 'a';&lt;/code> 此时将上一步得到的value 左移四位，得到&lt;code>0100 0000&lt;/code> 然后与实际值(&lt;code>'f'&lt;/code>表示的整型值 &lt;strong>15&lt;/strong> &lt;code>1111&lt;/code>)想加，即得到&lt;code>0100 1111&lt;/code>。
&lt;br>依此类推：最终得到的value = &lt;code>0100 1111 0110 0000&lt;/code> = &lt;code>20320&lt;/code>。&lt;/p></description></item></channel></rss>