1. 程式人生 > >使用 Java 將中文字元轉換成 Unicode 編碼

使用 Java 將中文字元轉換成 Unicode 編碼

這兩天操作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等作者資訊。

/*
 * CharacterSetToolkit.java
 *
 * Created on 2007年5月17日, 上午11:04
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/


package mobi.chenwei.wing.util;

/**
 * 進行字元操作的工具類。
 
 * 
@author Chen Wei
 * @website www.chenwei.mobi
 * @email [email protected]
 
*/

public
class CharacterSetToolkit {
    
    
/** Creates a new instance of CharacterSetToolkit */
    
public CharacterSetToolkit() {
    }

    
    
privatestaticfinalchar[] hexDigit ={
        
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
    }
;
    
    
privatestaticchar toHex(int nibble) {
        
return hexDigit[(nibble &0xF)];
    }

    
    
/**
     * 將字串編碼成 Unicode 。
     * 
@param theString 待轉換成Unicode編碼的字串。
     * 
@param escapeSpace 是否忽略空格。
     * 
@return 返回轉換後Unicode編碼的字串。
     
*/

    
publicstatic String toUnicode(String theString, boolean escapeSpace) {
        
int len = theString.length();
        
int bufLen = len *2;
        
if (bufLen <0{
            bufLen 
= Integer.MAX_VALUE;
        }

        StringBuffer outBuffer 
=new StringBuffer(bufLen);
        
        
for(int x=0; x<len; x++{
            
char aChar = theString.charAt(x);
            
// Handle common case first, selecting largest block that
            
// avoids the specials below
if ((aChar >61&& (aChar <127)) {
                
if (aChar =='/'{
                    outBuffer.append(
'/'); outBuffer.append('/');
                    
continue;
                }

                outBuffer.append(aChar);
                
continue;
            }

            
switch(aChar) {
                
case'':
                    
if (x ==0|| escapeSpace)
                        outBuffer.append(
'/');
                    outBuffer.append(
'');
                    
break;
                
case'':outBuffer.append('/'); outBuffer.append('t');
                
break;
                
case'':outBuffer.append('/'); outBuffer.append('n');
                
break;
                
case'':outBuffer.append('/'); outBuffer.append('r');
                
break;
                
case'':outBuffer.append('/'); outBuffer.append('f');
                
break;
                
case'='// Fall through
case':'// Fall through
case'#'// Fall through
case'!':
                    outBuffer.append(
'/'); outBuffer.append(aChar);
                    
break;
                
default:
                    
if ((aChar <0x0020|| (aChar >0x007e)) {
                        outBuffer.append(
'/');
                        outBuffer.append(
'u');
                        outBuffer.append(toHex((aChar 
>>12&0xF));
                        outBuffer.append(toHex((aChar 
>>8&0xF));
                        outBuffer.append(toHex((aChar 
>>4&0xF));
                        outBuffer.append(toHex( aChar        
&0xF));
                    }
else{
                        outBuffer.append(aChar);
                    }

            }

        }

        
return outBuffer.toString();
    }

    
    
/**
     * 從 Unicode 碼轉換成編碼前的特殊字串。
     * 
@param in Unicode編碼的字元陣列。
     * 
@param off 轉換的起始偏移量。
     * 
@param len 轉換的字元長度。
     * 
@param convtBuf 轉換的快取字元陣列。
     * 
@return 完成轉換,返回編碼前的特殊字串。
     
*/

    
public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
        
if (convtBuf.length < len) {
            
int newLen = len *2;
            
if (newLen <0{
                newLen 
= Integer.MAX_VALUE;
            }

            convtBuf 
=newchar[newLen];
        }

        
char aChar;
        
char[] out = convtBuf;
        
int outLen =0;
        
int end = off + len;
        
        
while (off < end) {
            aChar 
= in[off++];
            
if (aChar =='/'{
                aChar 
= in[off++];
                
if (aChar =='u'{
                    
// Read the xxxx
int value =0;
                    
for (int i =0; i <4; i++{
                        aChar 
= in[off++];
                        
switch (aChar) {
                            
case'0':
                            
case'1':
                            
case'2':
                            
case'3':
                            
case'4':
                            
case'5':
                            
case'6':
                            
case'7':
                            
case'8':
                            
case'9':
                                value 
= (value <<4+ aChar -'0';
                                
break;
                            
case'a':
                            
case'b':
                            
case'c':
                            
case'd':
                            
case'e':
                            
case'f':
                                value 
= (value <<4+10+ aChar -'a';
                                
break;

相關推薦

使用 Java 中文字元轉換 Unicode 編碼

這兩天操作XML使用到了Jdom,在建立XML檔案並輸出到硬碟的時候遇到一箇中文編碼的問題:Jdom預設輸出的XML編碼是UTF-8,但是文件中如果出現中文字元那麼該中文字元就會變成亂碼,造成XML檔案無法被正確解析。 UTF -8應該是可以用來表示中文的吧?我不知道這是不

中文轉換Unicode編碼Unicode編碼轉換中文Java程式碼實現

 import java.util.Properties; public class Test { public static void main(String[] args

控制檯程式的中文輸出亂碼問題(export LC_CTYPE=zh_CN.GBK,或者修改/etc/sysconfig/i18n為zh_CN.GBK。使用setlocale(LC_CTYPE, "");會使用預設辦法。編譯器會原始碼做轉換成Unicode格式,或者指定gcc的輸

今天發現用securecrt登陸時,gcc編譯出錯時會出現亂碼,但直接在主機的視窗介面下用Shell編譯卻沒有亂碼。查看了一下當時的錯誤描述,發現它的引號是中文引號,導致在SecureCRT中顯示出錯:  before numeric constant 在網上查了一下,可以

java資料庫資料轉換word文件並且生成pdf檔案最後轉換對應的圖片

目的:將資料轉換成word圖片的方式展現給使用者 工具:openoffice +java程式碼 +資料庫,其中openoffice有windows版本的和Linux版本的。 其中openoffice的下載地址為:連結:https://pan.baidu.com/s/1Y5Ra3TfNCc

Java時間戳轉換指定格式日期

public String TimeStamp2Date(String timestampString, String formats){      Long timestamp = Long.parseLong(timestampString)*1000;      S

中文漢字轉換拼音(全拼)

using System.Globalization; using System.Text; using System.Text.RegularExpressions; /// <summary> /// 漢字轉拼音類 /// </summary

Java小寫金額轉換大寫

public class Test { private static final String UNIT = "萬千佰拾億千佰拾萬千佰拾元角分"; private static final St

java金額數字轉換對應的漢字

記得這是一道面試題,今天中午花時間寫了下,貼程式碼: import java.util.Scanner; public class NumberToWord { private

Java 小寫金額轉換大寫金額

將小寫金額轉換成大寫金額 例如:110.00轉換後為 壹佰壹拾圓整 程式碼如下 /** * 將小寫金額轉換為大寫 * * @param amount * 110.00 * @retu

如何用JAVA二進位制檔案轉換BASE64格式儲存到MySQL的Blob欄位裡並讀出下載

由於需求要將上傳的檔案以BASE64的方式儲存到MySQL的Blob欄位,並可以讀取Blob欄位下載生成檔案,方法如下: 1、下載用於BASE64編碼轉換的sun.misc.BASE64Decoder

JSunicode碼轉中文方法(解決IE8對JSON.stringify中文轉換unicode的問題)

第①種情況:(無特殊字元) // 把json物件轉為json串 var stringcontent = JSON.stringify(data.jsonObject); //此時變數為:stringcontent={policy":[{"name":"must_inst

隨便發發,java gb2312與中文字元轉換,以及中文Unicode轉換

/**      * 中文轉Unicode      * @param gbString      * @return      */    public static String UnicodeEncoding(String gbString) {   //gbStri

Java漢字轉換URL編碼

String abcd = "中文";//或者使用abcd = "\u0061\u4E2D\u6587"; System.out.println(java.net.URLEncoder

【轉載】如何用VB6在中文系統下把Unicode編碼的日文字元Shift-JIS編碼

這個題目有點變態,不過有時確實會有這種需求,起碼我就碰到過。同樣變態的需求還有“如何用VB6在日文系統下把Unicode編碼的中文字元轉成GB2312編碼”。這種需求有個比較時髦的名字,叫做“國際對應”。本文將提供幾種解決方法。一:繁瑣的方法如果之前看過我貼的那篇VB6中EBCDIC碼和Unicode碼之間的

Java中文轉換拼音,用於字母的模糊查詢

/** * 將漢字轉換為拼音 * @author Champion.Wong * */ public class Trans2PinYin { private static int[] pyvalue =

oracle改進之阿拉伯數字轉換中文數字

replace 工作 漢字 spa bsp func ace 延展 char   本博客是自己在學習和工作途中的積累與總結。 將阿拉伯數字轉換成中文漢字,方法自定義函數      create or replace function formate(val in num

阿拉伯數字轉換中文的php函數

ont enum pre == tin 函數 array light blog function toChinaseNum($num){ $char = array("零","一","二","三","四","五","六","七","八","九"); $dw

Java對網路圖片/本地圖片轉換Base64編碼和解碼

一、將本地圖片轉換成Base64編碼字串   /** * 將本地圖片轉換成Base64編碼字串 * * @param imgFile 圖片目錄路徑 * @return */ public static String getImgFi

[Java] Jar2Exe,jar2工具jar包轉換exe可執行檔案的詳細過程

[Java] Jar2Exe,jar2工具將jar包轉換成exe可執行檔案的詳細過程 軟體下載地址 連結: https://pan.baidu.com/s/1Ei39JYGpb7wyS9UkMl1GTQ 提取碼: yvkv 一、首先將程式匯出為jar包 1、在MyEcli

浮點數轉換人命幣讀法字串 java

題目:編寫一個程式,將浮點數轉換成人命幣讀法字串,例如,將1006.333轉換成壹仟零陸元叄角叄分 下面是我的解決方案,雖然沒有大神的那麼優秀,但是功能上還是差不多的。測試資料是從別人程式碼那裡賦值過來的。可能 註釋 中存在錯誤。 package t