使用 Java 将中文字符转换成 Unicode 编码

时间:2021-12-18 07:39:49

版权声明:转载时请务必保留以下作者信息和链接
作者:陈维(chenweionline@hotmail.com)作者的网站:http://www.chenwei.mobi

这两天操作XML使用到了Jdom,在创建XML文件并输出到硬盘的时候遇到一个中文编码的问题:Jdom默认输出的XML编码是UTF-8,但是文档中如果出现中文字符那么该中文字符就会变成乱码,造成XML文件无法被正确解析。

UTF -8应该是可以用来表示中文的吧?我不知道这是不是Jdom的一个BUG(Jdom 1.0,beta了10次的产物哦!)。我google了一下,大家解决这个问题的办法无非是把Jdom的输出字符集改为GBK或者GB2312,但是这样就会有一些副作用,如果在没有特定字符集(GBK或者GB2312)的操作系统上不是依然不能正确解析吗?一个比较好的解决办法是先把中文转换成 Unicode编码在直接输出,程序解析XML后的时候再把Unicode编码转回中文就没有问题了。

于是我查看了JDK的文档, 截至Java 5好像都没有做类似转换的类可以直接使用,但是我发现一个类 java.util.Properties,它的源代码里有两个私有(private)方法 loadConvert (char[] in, int off, int len, char[] convtBuf) 和 saveConvert(String theString, boolean escapeSpace) 其实就是做特殊字符和Unicode编码字符间转换的,我把它们提取出来,单独包装到一个类里就可以使用了。

下面是我包装的类 CharacterSetToolkit.java,若你在项目中使用请不要改变package及author等作者信息。

 

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码 /*
使用 Java 将中文字符转换成 Unicode 编码 * CharacterSetToolkit.java
使用 Java 将中文字符转换成 Unicode 编码 *
使用 Java 将中文字符转换成 Unicode 编码 * Created on 2007年5月17日, 上午11:04
使用 Java 将中文字符转换成 Unicode 编码 *
使用 Java 将中文字符转换成 Unicode 编码 * To change this template, choose Tools | Template Manager
使用 Java 将中文字符转换成 Unicode 编码 * and open the template in the editor.
使用 Java 将中文字符转换成 Unicode 编码 
*/

使用 Java 将中文字符转换成 Unicode 编码
使用 Java 将中文字符转换成 Unicode 编码
package  mobi.chenwei.wing.util;
使用 Java 将中文字符转换成 Unicode 编码
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码
/**
使用 Java 将中文字符转换成 Unicode 编码 * 进行字符操作的工具类。
使用 Java 将中文字符转换成 Unicode 编码 
使用 Java 将中文字符转换成 Unicode 编码 * 
@author Chen Wei
使用 Java 将中文字符转换成 Unicode 编码 * @website www.chenwei.mobi
使用 Java 将中文字符转换成 Unicode 编码 * @email chenweionline@hotmail.com
使用 Java 将中文字符转换成 Unicode 编码 
*/

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码
public   class  CharacterSetToolkit  {
使用 Java 将中文字符转换成 Unicode 编码    
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
/** Creates a new instance of CharacterSetToolkit */
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
public CharacterSetToolkit() {
使用 Java 将中文字符转换成 Unicode 编码    }

使用 Java 将中文字符转换成 Unicode 编码    
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
private static final char[] hexDigit = {
使用 Java 将中文字符转换成 Unicode 编码        
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
使用 Java 将中文字符转换成 Unicode 编码    }
;
使用 Java 将中文字符转换成 Unicode 编码    
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
private static char toHex(int nibble) {
使用 Java 将中文字符转换成 Unicode 编码        
return hexDigit[(nibble & 0xF)];
使用 Java 将中文字符转换成 Unicode 编码    }

使用 Java 将中文字符转换成 Unicode 编码    
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
/**
使用 Java 将中文字符转换成 Unicode 编码     * 将字符串编码成 Unicode 。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param theString 待转换成Unicode编码的字符串。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param escapeSpace 是否忽略空格。
使用 Java 将中文字符转换成 Unicode 编码     * 
@return 返回转换后Unicode编码的字符串。
使用 Java 将中文字符转换成 Unicode 编码     
*/

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
public static String toUnicode(String theString, boolean escapeSpace) {
使用 Java 将中文字符转换成 Unicode 编码        
int len = theString.length();
使用 Java 将中文字符转换成 Unicode 编码        
int bufLen = len * 2;
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码        
if (bufLen < 0{
使用 Java 将中文字符转换成 Unicode 编码            bufLen 
= Integer.MAX_VALUE;
使用 Java 将中文字符转换成 Unicode 编码        }

使用 Java 将中文字符转换成 Unicode 编码        StringBuffer outBuffer 
= new StringBuffer(bufLen);
使用 Java 将中文字符转换成 Unicode 编码        
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码        
for(int x=0; x<len; x++{
使用 Java 将中文字符转换成 Unicode 编码            
char aChar = theString.charAt(x);
使用 Java 将中文字符转换成 Unicode 编码            
// Handle common case first, selecting largest block that
使用 Java 将中文字符转换成 Unicode 编码            
// avoids the specials below
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码
            if ((aChar > 61&& (aChar < 127)) {
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                
if (aChar == '/'{
使用 Java 将中文字符转换成 Unicode 编码                    outBuffer.append(
'/'); outBuffer.append('/');
使用 Java 将中文字符转换成 Unicode 编码                    
continue;
使用 Java 将中文字符转换成 Unicode 编码                }

使用 Java 将中文字符转换成 Unicode 编码                outBuffer.append(aChar);
使用 Java 将中文字符转换成 Unicode 编码                
continue;
使用 Java 将中文字符转换成 Unicode 编码            }

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码            
switch(aChar) {
使用 Java 将中文字符转换成 Unicode 编码                
case ' ':
使用 Java 将中文字符转换成 Unicode 编码                    
if (x == 0 || escapeSpace)
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(
'/');
使用 Java 将中文字符转换成 Unicode 编码                    outBuffer.append(
' ');
使用 Java 将中文字符转换成 Unicode 编码                    
break;
使用 Java 将中文字符转换成 Unicode 编码                
case ' ':outBuffer.append('/'); outBuffer.append('t');
使用 Java 将中文字符转换成 Unicode 编码                
break;
使用 Java 将中文字符转换成 Unicode 编码                
case ' ':outBuffer.append('/'); outBuffer.append('n');
使用 Java 将中文字符转换成 Unicode 编码                
break;
使用 Java 将中文字符转换成 Unicode 编码                
case ' ':outBuffer.append('/'); outBuffer.append('r');
使用 Java 将中文字符转换成 Unicode 编码                
break;
使用 Java 将中文字符转换成 Unicode 编码                
case ' ':outBuffer.append('/'); outBuffer.append('f');
使用 Java 将中文字符转换成 Unicode 编码                
break;
使用 Java 将中文字符转换成 Unicode 编码                
case '='// Fall through
使用 Java 将中文字符转换成 Unicode 编码
                case ':'// Fall through
使用 Java 将中文字符转换成 Unicode 编码
                case '#'// Fall through
使用 Java 将中文字符转换成 Unicode 编码
                case '!':
使用 Java 将中文字符转换成 Unicode 编码                    outBuffer.append(
'/'); outBuffer.append(aChar);
使用 Java 将中文字符转换成 Unicode 编码                    
break;
使用 Java 将中文字符转换成 Unicode 编码                
default:
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    
if ((aChar < 0x0020|| (aChar > 0x007e)) {
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(
'/');
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(
'u');
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(toHex((aChar 
>> 12& 0xF));
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(toHex((aChar 
>>  8& 0xF));
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(toHex((aChar 
>>  4& 0xF));
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(toHex( aChar        
& 0xF));
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    }
 else {
使用 Java 将中文字符转换成 Unicode 编码                        outBuffer.append(aChar);
使用 Java 将中文字符转换成 Unicode 编码                    }

使用 Java 将中文字符转换成 Unicode 编码            }

使用 Java 将中文字符转换成 Unicode 编码        }

使用 Java 将中文字符转换成 Unicode 编码        
return outBuffer.toString();
使用 Java 将中文字符转换成 Unicode 编码    }

使用 Java 将中文字符转换成 Unicode 编码    
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
/**
使用 Java 将中文字符转换成 Unicode 编码     * 从 Unicode 码转换成编码前的特殊字符串。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param in Unicode编码的字符数组。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param off 转换的起始偏移量。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param len 转换的字符长度。
使用 Java 将中文字符转换成 Unicode 编码     * 
@param convtBuf 转换的缓存字符数组。
使用 Java 将中文字符转换成 Unicode 编码     * 
@return 完成转换,返回编码前的特殊字符串。
使用 Java 将中文字符转换成 Unicode 编码     
*/

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码    
public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码        
if (convtBuf.length < len) {
使用 Java 将中文字符转换成 Unicode 编码            
int newLen = len * 2;
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码            
if (newLen < 0{
使用 Java 将中文字符转换成 Unicode 编码                newLen 
= Integer.MAX_VALUE;
使用 Java 将中文字符转换成 Unicode 编码            }

使用 Java 将中文字符转换成 Unicode 编码            convtBuf 
= new char[newLen];
使用 Java 将中文字符转换成 Unicode 编码        }

使用 Java 将中文字符转换成 Unicode 编码        
char aChar;
使用 Java 将中文字符转换成 Unicode 编码        
char[] out = convtBuf;
使用 Java 将中文字符转换成 Unicode 编码        
int outLen = 0;
使用 Java 将中文字符转换成 Unicode 编码        
int end = off + len;
使用 Java 将中文字符转换成 Unicode 编码        
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码        
while (off < end) {
使用 Java 将中文字符转换成 Unicode 编码            aChar 
= in[off++];
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码            
if (aChar == '/'{
使用 Java 将中文字符转换成 Unicode 编码                aChar 
= in[off++];
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                
if (aChar == 'u'{
使用 Java 将中文字符转换成 Unicode 编码                    
// Read the xxxx
使用 Java 将中文字符转换成 Unicode 编码
                    int value = 0;
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    
for (int i = 0; i < 4; i++{
使用 Java 将中文字符转换成 Unicode 编码                        aChar 
= in[off++];
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                        
switch (aChar) {
使用 Java 将中文字符转换成 Unicode 编码                            
case '0':
使用 Java 将中文字符转换成 Unicode 编码                            
case '1':
使用 Java 将中文字符转换成 Unicode 编码                            
case '2':
使用 Java 将中文字符转换成 Unicode 编码                            
case '3':
使用 Java 将中文字符转换成 Unicode 编码                            
case '4':
使用 Java 将中文字符转换成 Unicode 编码                            
case '5':
使用 Java 将中文字符转换成 Unicode 编码                            
case '6':
使用 Java 将中文字符转换成 Unicode 编码                            
case '7':
使用 Java 将中文字符转换成 Unicode 编码                            
case '8':
使用 Java 将中文字符转换成 Unicode 编码                            
case '9':
使用 Java 将中文字符转换成 Unicode 编码                                value 
= (value << 4+ aChar - '0';
使用 Java 将中文字符转换成 Unicode 编码                                
break;
使用 Java 将中文字符转换成 Unicode 编码                            
case 'a':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'b':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'c':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'd':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'e':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'f':
使用 Java 将中文字符转换成 Unicode 编码                                value 
= (value << 4+ 10 + aChar - 'a';
使用 Java 将中文字符转换成 Unicode 编码                                
break;
使用 Java 将中文字符转换成 Unicode 编码                            
case 'A':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'B':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'C':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'D':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'E':
使用 Java 将中文字符转换成 Unicode 编码                            
case 'F':
使用 Java 将中文字符转换成 Unicode 编码                                value 
= (value << 4+ 10 + aChar - 'A';
使用 Java 将中文字符转换成 Unicode 编码                                
break;
使用 Java 将中文字符转换成 Unicode 编码                            
default:
使用 Java 将中文字符转换成 Unicode 编码                                
throw new IllegalArgumentException(
使用 Java 将中文字符转换成 Unicode 编码                                        
"Malformed /uxxxx encoding.");
使用 Java 将中文字符转换成 Unicode 编码                        }

使用 Java 将中文字符转换成 Unicode 编码                    }

使用 Java 将中文字符转换成 Unicode 编码                    out[outLen
++= (char) value;
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                }
 else {
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    
if (aChar == 't'{
使用 Java 将中文字符转换成 Unicode 编码                        aChar 
= ' ';
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    }
 else if (aChar == 'r'{
使用 Java 将中文字符转换成 Unicode 编码                        aChar 
= ' ';
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    }
 else if (aChar == 'n'{
使用 Java 将中文字符转换成 Unicode 编码                        aChar 
= ' ';
使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码                    }
 else if (aChar == 'f'{
使用 Java 将中文字符转换成 Unicode 编码                        aChar 
= ' ';
使用 Java 将中文字符转换成 Unicode 编码                    }

使用 Java 将中文字符转换成 Unicode 编码                    out[outLen
++= aChar;
使用 Java 将中文字符转换成 Unicode 编码                }

使用 Java 将中文字符转换成 Unicode 编码使用 Java 将中文字符转换成 Unicode 编码            }
 else {
使用 Java 将中文字符转换成 Unicode 编码                out[outLen
++= (char) aChar;
使用 Java 将中文字符转换成 Unicode 编码            }

使用 Java 将中文字符转换成 Unicode 编码        }

使用 Java 将中文字符转换成 Unicode 编码        
return new String(out, 0, outLen);
使用 Java 将中文字符转换成 Unicode 编码    }

使用 Java 将中文字符转换成 Unicode 编码}