﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Do you drink java?-随笔分类-Java Language</title><link>http://www.blogjava.net/leon/category/11537.html</link><description>&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;像写情书一样coding</description><language>zh-cn</language><lastBuildDate>Thu, 22 Nov 2007 20:53:24 GMT</lastBuildDate><pubDate>Thu, 22 Nov 2007 20:53:24 GMT</pubDate><ttl>60</ttl><item><title>[tips]使用Java将中文字符转换成Unicode编码</title><link>http://www.blogjava.net/leon/archive/2006/10/28/77846.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sat, 28 Oct 2006 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/10/28/77846.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/77846.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/10/28/77846.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/77846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/77846.html</trackback:ping><description><![CDATA[
		<p>这两天操作XML使用到了Jdom，在创建XML文件并输出到硬盘的时候遇到一个中文编码的问题：Jdom默认输出的XML编码是UTF-8，但是文档中如果出现中文字符那么该中文字符就会变成乱码，造成XML文件无法被正确解析。</p>
		<p>UTF-8应该是可以用来表示中文的吧？我不知道这是不是Jdom的一个BUG（Jdom 1.0，beta了10次的产物哦！）。我google了一下，大家解决这个问题的办法无非是把Jdom的输出字符集改为GBK或者GB2312，但是这样就会有一些副作用，如果在没有特定字符集（GBK或者GB2312）的操作系统上不是依然不能正确解析吗？一个比较好的解决办法是先把中文转换成Unicode编码在直接输出，程序解析XML后的时候再把Unicode编码转回中文就没有问题了。</p>
		<p>于是我查看了JDK的文档，截至Java 5好像都没有做类似转换的类可以直接使用，但是我发现一个类 java.util.Properties，它的源代码里有两个私有（private）方法 loadConvert (char[] in, int off, int len, char[] convtBuf) 和 saveConvert(String theString, boolean escapeSpace) 其实就是做特殊字符和Unicode编码字符间转换的，我把它们提取出来，单独包装到一个类里就可以使用了。</p>
		<p>下面是我包装的类 CharacterSetToolkit</p>
		<p>/*<br /> * CharacterSetToolkit.java<br /> *<br /> * Created on 2006年10月27日, 下午2:06<br /> *<br /> * To change this template, choose Tools | Template Manager<br /> * and open the template in the editor.<br /> */</p>
		<p>package mobi.chenwei.lang;</p>
		<p>/**<br /> * 进行字符操作的工具类<br /> * @author Chen Wei<br /> * @email <a href="mailto:chenwei.mobi@gmail.com">chenwei.mobi@gmail.com</a><br /> */<br />public class CharacterSetToolkit {<br />    <br />    /** Creates a new instance of CharacterSetToolkit */<br />    public CharacterSetToolkit() {<br />    }<br />    <br />    private static final char[] hexDigit = {<br />        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'<br />    };<br />    <br />    private static char toHex(int nibble) {<br />        return hexDigit[(nibble &amp; 0xF)];<br />    }<br />    <br />    /**<br />     * 将字符串编码成 Unicode 。<br />     * @param theString 待转换成Unicode编码的字符串。<br />     * @param escapeSpace 是否忽略空格。<br />     * @return 返回转换后Unicode编码的字符串。<br />     */<br />    public static String toUnicode(String theString, boolean escapeSpace) {<br />        int len = theString.length();<br />        int bufLen = len * 2;<br />        if (bufLen &lt; 0) {<br />            bufLen = Integer.MAX_VALUE;<br />        }<br />        StringBuffer outBuffer = new StringBuffer(bufLen);</p>
		<p>        for(int x=0; x&lt;len; x++) {<br />            char aChar = theString.charAt(x);<br />            // Handle common case first, selecting largest block that<br />            // avoids the specials below<br />            if ((aChar &gt; 61) &amp;&amp; (aChar &lt; 127)) {<br />                if (aChar == '\\') {<br />                    outBuffer.append('\\'); outBuffer.append('\\');<br />                    continue;<br />                }<br />                outBuffer.append(aChar);<br />                continue;<br />            }<br />            switch(aChar) {<br />                case ' ':<br />                    if (x == 0 || escapeSpace) <br />                        outBuffer.append('\\');<br />                    outBuffer.append(' ');<br />                    break;<br />                case '\t':outBuffer.append('\\'); outBuffer.append('t');<br />                          break;<br />                case '\n':outBuffer.append('\\'); outBuffer.append('n');<br />                          break;<br />                case '\r':outBuffer.append('\\'); outBuffer.append('r');<br />                          break;<br />                case '\f':outBuffer.append('\\'); outBuffer.append('f');<br />                          break;<br />                case '=': // Fall through<br />                case ':': // Fall through<br />                case '#': // Fall through<br />                case '!':<br />                    outBuffer.append('\\'); outBuffer.append(aChar);<br />                    break;<br />                default:<br />                    if ((aChar &lt; 0x0020) || (aChar &gt; 0x007e)) {<br />                        outBuffer.append('\\');<br />                        outBuffer.append('u');<br />                        outBuffer.append(toHex((aChar &gt;&gt; 12) &amp; 0xF));<br />                        outBuffer.append(toHex((aChar &gt;&gt;  8) &amp; 0xF));<br />                        outBuffer.append(toHex((aChar &gt;&gt;  4) &amp; 0xF));<br />                        outBuffer.append(toHex( aChar        &amp; 0xF));<br />                    } else {<br />                        outBuffer.append(aChar);<br />                    }<br />            }<br />        }<br />        return outBuffer.toString();<br />    }<br />    <br />    /**<br />     * 从 Unicode 码转换成编码前的特殊字符串。<br />     * @param in Unicode编码的字符数组。<br />     * @param off 转换的起始偏移量。<br />     * @param len 转换的字符长度。<br />     * @param convtBuf 转换的缓存字符数组。<br />     * @return 完成转换，返回编码前的特殊字符串。<br />     */<br />    public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {<br />        if (convtBuf.length &lt; len) {<br />            int newLen = len * 2;<br />            if (newLen &lt; 0) {<br />                newLen = Integer.MAX_VALUE;<br />            }<br />            convtBuf = new char[newLen];<br />        }<br />        char aChar;<br />        char[] out = convtBuf;<br />        int outLen = 0;<br />        int end = off + len;</p>
		<p>        while (off &lt; end) {<br />            aChar = in[off++];<br />            if (aChar == '\\') {<br />                aChar = in[off++];<br />                if (aChar == 'u') {<br />                    // Read the xxxx<br />                    int value = 0;<br />                    for (int i = 0; i &lt; 4; i++) {<br />                        aChar = in[off++];<br />                        switch (aChar) {<br />                        case '0':<br />                        case '1':<br />                        case '2':<br />                        case '3':<br />                        case '4':<br />                        case '5':<br />                        case '6':<br />                        case '7':<br />                        case '8':<br />                        case '9':<br />                            value = (value &lt;&lt; 4) + aChar - '0';<br />                            break;<br />                        case 'a':<br />                        case 'b':<br />                        case 'c':<br />                        case 'd':<br />                        case 'e':<br />                        case 'f':<br />                            value = (value &lt;&lt; 4) + 10 + aChar - 'a';<br />                            break;<br />                        case 'A':<br />                        case 'B':<br />                        case 'C':<br />                        case 'D':<br />                        case 'E':<br />                        case 'F':<br />                            value = (value &lt;&lt; 4) + 10 + aChar - 'A';<br />                            break;<br />                        default:<br />                            throw new IllegalArgumentException(<br />                                    "Malformed <a href="file://\\uxxxx">\\uxxxx</a> encoding.");<br />                        }<br />                    }<br />                    out[outLen++] = (char) value;<br />                } else {<br />                    if (aChar == 't') {<br />                        aChar = '\t';<br />                    } else if (aChar == 'r') {<br />                        aChar = '\r';<br />                    } else if (aChar == 'n') {<br />                        aChar = '\n';<br />                    } else if (aChar == 'f') {<br />                        aChar = '\f';<br />                    }<br />                    out[outLen++] = aChar;<br />                }<br />            } else {<br />                out[outLen++] = (char) aChar;<br />            }<br />        }<br />        return new String(out, 0, outLen);<br />    }<br />}<br /></p>
<img src ="http://www.blogjava.net/leon/aggbug/77846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-10-28 20:53 <a href="http://www.blogjava.net/leon/archive/2006/10/28/77846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[tips]Java 中十进制十六进制相互转换</title><link>http://www.blogjava.net/leon/archive/2006/09/19/70488.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Tue, 19 Sep 2006 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/09/19/70488.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/70488.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/09/19/70488.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/70488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/70488.html</trackback:ping><description><![CDATA[// 十进制转化为十六进制，结果为C8。<br />
Integer.toHexString(200); <br />
<br />
// 十六进制转化为十进制，结果140。<br />
Integer.parseInt("8C",16); 
<img src ="http://www.blogjava.net/leon/aggbug/70488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-09-19 12:02 <a href="http://www.blogjava.net/leon/archive/2006/09/19/70488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[tips] Java中的四舍五入</title><link>http://www.blogjava.net/leon/archive/2006/06/07/51073.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Wed, 07 Jun 2006 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/06/07/51073.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/51073.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/06/07/51073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/51073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/51073.html</trackback:ping><description><![CDATA[
		<p>Java.lang.Math的round()方法返回的是整型，如果要保留小数位的话可以先乘以（小数位数 *  10），使用Java.lang.Math的round()方法计算之后再除以（小数位数 *  10）。<br /><br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_4_116_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_116_Open_Text.style.display='none'; Codehighlighter1_4_116_Closed_Image.style.display='inline'; Codehighlighter1_4_116_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_4_116_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_116_Closed_Text.style.display='none'; Codehighlighter1_4_116_Open_Image.style.display='inline'; Codehighlighter1_4_116_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000">    </span>
				<span id="Codehighlighter1_4_116_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
				<span id="Codehighlighter1_4_116_Open_Text">
						<span style="COLOR: #008000">/**</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * 浮点数的四舍五入。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span>
						<span style="COLOR: #808080">@param</span>
						<span style="COLOR: #008000"> f float 代表源浮点数<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span>
						<span style="COLOR: #808080">@param</span>
						<span style="COLOR: #008000"> digits int 保留的小数点后位数<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span>
						<span style="COLOR: #808080">@return</span>
						<span style="COLOR: #008000"> float<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_169_461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_169_461_Open_Text.style.display='none'; Codehighlighter1_169_461_Closed_Image.style.display='inline'; Codehighlighter1_169_461_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_169_461_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_169_461_Closed_Text.style.display='none'; Codehighlighter1_169_461_Open_Image.style.display='inline'; Codehighlighter1_169_461_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">float</span>
				<span style="COLOR: #000000"> round(</span>
				<span style="COLOR: #0000ff">float</span>
				<span style="COLOR: #000000"> f, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> digits) </span>
				<span id="Codehighlighter1_169_461_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_169_461_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">float</span>
						<span style="COLOR: #000000"> offset </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> 1f;<br /><img id="Codehighlighter1_223_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_223_258_Open_Text.style.display='none'; Codehighlighter1_223_258_Closed_Image.style.display='inline'; Codehighlighter1_223_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_223_258_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_223_258_Closed_Text.style.display='none'; Codehighlighter1_223_258_Open_Image.style.display='inline'; Codehighlighter1_223_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (digits </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span id="Codehighlighter1_223_258_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_223_258_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            offset </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> 1f;<br /><img id="Codehighlighter1_281_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_281_326_Open_Text.style.display='none'; Codehighlighter1_281_326_Closed_Image.style.display='inline'; Codehighlighter1_281_326_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_281_326_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_326_Closed_Text.style.display='none'; Codehighlighter1_281_326_Open_Image.style.display='inline'; Codehighlighter1_281_326_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span>
						</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (digits </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span id="Codehighlighter1_281_326_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_281_326_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            offset </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> digits </span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> 10f;<br /><img id="Codehighlighter1_349_381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_349_381_Open_Text.style.display='none'; Codehighlighter1_349_381_Closed_Image.style.display='inline'; Codehighlighter1_349_381_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_349_381_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_349_381_Closed_Text.style.display='none'; Codehighlighter1_349_381_Open_Image.style.display='inline'; Codehighlighter1_349_381_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span>
						</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (digits </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span id="Codehighlighter1_349_381_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_349_381_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> f;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        f </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> java.lang.Math.round(f </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> offset) </span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #000000"> offset;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> f;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
				</span>
		</div>
<img src ="http://www.blogjava.net/leon/aggbug/51073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-06-07 11:50 <a href="http://www.blogjava.net/leon/archive/2006/06/07/51073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>