CNS11643 中文全字庫 CNS11643 中文全字庫 CNS11643 中文全字庫
字碼查詢 請於空白格上按滑鼠右鍵選取輸入法,拼成並選字後按[Enter]鍵與[查詢]>使用說明  

首頁轉碼互通 › 轉碼 Web Service

轉碼 Web Service

1. 取得SOAP協議的Web Service Server位置 [WSDL]

2. 提供函式說明

 A. 文件轉碼之呼叫介面

介面名稱

transfer

說明

提供文件轉碼,來源文件必須是純文字檔或壓縮檔(純文字檔的壓縮檔);目的文件則包裝在DataHandler物件並回傳。

  輸入之參數說明:

參數名稱

預設值

必填/選填

說明

srcFmt

null

必填

來源編碼格式,
String
物件,
設定值見「編碼格式」

destFmt

null

必填

目的編碼格式,
String
物件,
設定值見「編碼格式」

docFileName

null

必填

來源檔案路徑,
String
物件

docDataHandler

null

必填

包裝來源檔案的物件,

DataHandler物件

srcTableFileName

null

選填,
值可為null

來源自訂對照表檔案路徑,
若不使用設定為null
String
物件

srcTableDataHandler

null

選填,
值可為null

包裝來源自訂對照表檔案的物件,
若不使用設定為null
DataHandler
物件

destTableFileName

null

選填,
值可為null

目的自訂對照表檔案路徑,
若不使用設定為null
String
物件

destTableDataHandler

null

選填,
值可為null

包裝目的自訂對照表檔案的物件,
若不使用設定為null
DataHandler
物件

uploadZipFileEncoding

null

選填,
值可為null

壓縮軟體在產生壓縮檔時,會使用作業系統預設的編碼格式進行壓縮,而解壓縮也必須使用同樣的編碼格式在能正確解壓縮,因此,需要設定此項參數轉碼Web Service才能正確解壓縮檔案,
String
物件,
設定值見「壓縮檔編碼格式」

  輸出之結果說明:

輸出物件

說明

DataHandler

目的文件壓縮檔包裝在DataHandler物件並回傳,壓縮檔含:

目的文件檔

轉碼過程之log資訊檔

CNS Tag中繼檔

明碼文字檔,只有目的編碼設定為CSIC時有值,其他編碼格式則不產生

 

 B. 文字轉碼之呼叫介面

介面名稱

transferString

說明

提供字串轉碼,來源字串與目的字串都是以bytes資料型態經過base64編碼轉換而成的字串。回傳資料型態為字串陣列,長度為5,格式如下:

 陣列0:編碼格式

 陣列1:目的字串,以bytes資料型態
     經過base64編碼轉換而成的字串

 陣列2:轉碼過程之log資訊

 陣列3CNS Tag

 陣列4:明碼,只有目的編碼設定為CSIC時有值,
     其他編碼格式則回傳null

為確保資料的正確性,處理過程以bytes資料型態處理。

  輸入之參數說明:

參數名稱

預設值

必填/選填

說明

srcFmt

null

必填

來源編碼格式,
String
物件,
設定值見「編碼格式」

destFmt

null

必填

目的編碼格式,
String
物件,
設定值見「編碼格式」

content

null

必填

來源文字,以bytes資料型態經過base64編碼轉換而成的字串,
String
物件

srcTableCharset

null

選填,
值可為null

來源自訂對照表的id,或設null表示不使用自訂對照表格式,只用轉碼Web Service提供的對照表格式,
String
物件

srcTableContent

null

選填,
值可為null

來源自訂對照表內容,或設null表示不使用自訂對照表內容,
String
物件

destTableCharset

null

選填,
值可為null

目的自訂對照表的id,或設null表示不使用自訂對照表格式,只用轉碼Web Service提供的對照表格式,,
String
物件

destTableContent

null

選填,
值可為null

目的自訂對照表內容,或設null表示不使用自訂對照表內容,
String
物件

  輸出之結果說明:

輸出物件

說明

String[]

長度為5,格式如下:

 陣列0:編碼格式

 陣列1:目的字串,以bytes資料型態
     經過base64編碼轉換而成的字串

 陣列2:轉碼過程之log資訊

 陣列3CNS Tag

 陣列4:明碼,只有目的編碼設定為CSIC時有值,
     其他編碼格式則回傳null

 

3. 編碼格式(srcFmt, destFmt)

下表為轉碼Web Service可接受之編碼格式,同時也是可輸出之編碼格式。使用轉碼Web Service時,請根據文件之編碼格式設定參數,例如:
來源文件之編碼格式為ANSI(Big5)想要轉換成Unicode 5.2 UTF-8,則呼叫轉碼Web Service時,設定來源編碼格式為big5@big5,而輸出之目的編碼格式為utf-8@unicode5_2

編碼格式

編碼名稱

big5@big5

ANSI(Big5)

big5@big5e

ANSI(Big5E)

cns_ls@cns_ls

CSIC LS(正式)

cns_lsc@cns_lsc

CSIC LS(專用)

cns_ss@cns_ss

CSIC SS(正式)

cns_ssc@cns_ssc

CSIC SS(專用)

cns@cns

CNS國家標準交換碼

dci@dci

公路監理(電信碼)

euc@euc

EUC

fin@fin

稅務內碼

inc@inc

工商內碼

tax@tax

財稅交換碼

utf-8@unicode2_0

UTF-8 Unicode 2.0

utf-16le@unicode2_0

UTF-16LE Unicode 2.0

utf-16be@unicode2_0

UTF-16BE Unicode 2.0

utf-8@unicode3_0

UTF-8 Unicode 3.0

utf-16le@unicode3_0

UTF-16LE Unicode 3.0

utf-16be@unicode3_0

UTF-16BE Unicode 3.0

utf-8@unicode3_1

UTF-8 Unicode 3.1

utf-16le@unicode3_1

UTF-16LE Unicode 3.1

utf-16be@unicode3_1

UTF-16BE Unicode 3.1

utf-8@unicode5_2

UTF-8 Unicode 5.2

utf-16le@unicode5_2

UTF-16LE Unicode 5.2

utf-16be@unicode5_2

UTF-16BE Unicode 5.2

udf@udf

自訂

 

4. 壓縮檔編碼格式(uploadZipFileEncoding)

壓縮軟體在產生壓縮檔時,會使用作業系統預設的編碼格式進行壓縮,而解壓縮也必須使用同樣的編碼格式在能正確解壓縮,因此,需要設定此項參數轉碼Web Service才能正確解壓縮檔案

壓縮檔編碼格式

說明

ms950

Windows作業系統上產生壓縮檔所使用的編碼格式

utf-8

Linux作業系統上產生壓縮檔所使用的編碼格式

null

純文字檔,非壓縮檔

 

5. 自訂對照表格式

自訂對照表格式分成 Header Content

Header必須包含下列屬性名稱與值,每一列只有一組屬性,每一組屬性必須以「#」為開頭並且以「:」為分隔,其格式為 #propertyName:propertyValue

參數名稱

預設值

說明

online

true

設定可否使用該對照表
true
表示可使用
false
表示不使用

name

(空字串)

對照表名稱,用於選單內所選取的對照表名稱可用’,’隔開供多個對照表名稱使用,大都用於unicode,如:
UTF-8 Unicode 2.0,UTF-16LE Unicode 2.0,UTF-16BE Unicode 2.0
表示分別供utf-8utf-16leutf-16be使用同時此對照表為unicode2.0版本。

id

(空字串)

用來區別對照表,每一個檔案的id必須是獨一的,並且格式必須是「code_format@code_base

code_format:代表此對照表的編碼格式代號,協助區別不同種類的編碼格式

code_base:代表此對照表的基底代號,協助區別對照表之間的繼承關係

id可用’,’格開,分多個名稱使用,僅用於unicode,如:
utf-8@unicode2_0,utf-16le@unicode2_0,utf-16be@unicode2_0
表示cns_unicode2_0.txt對照表有三組id

type

bin

對照表編碼方式:
bin
表示內碼
exchange
表示交換碼

pattern

(空字串)

當轉碼過程中發生錯誤時,轉碼工具需要輸出錯誤資訊以及正在處理的位元碼。此時可透過pattern設定格式化輸出,增加log可讀性。
pattern
必須含value字串的標籤,作為體換位元碼的依據。如:pattern=<code=value/>,正在處理的位元碼為0xBC77,則輸出錯誤資訊時value會被HEX位元碼的字串取代並輸出為<code=BC77/>

base

(空字串)

表示此對照表繼承了另一個對照表的內容,若值為空字串,則表示此對照表沒有繼承別的對照表。

base的值為idcode_base,如:
big5e
對照表繼承了big5對照表的內容,
big5
對照表的idbig5@big5code_base值為big5,則big5e對照表的base值為big5。反之,big5沒有繼承別的對照表,所以big5對照表的base值為空字串。

failed_code

(空字串)

當設定檔outputFalidCodetrue,轉碼過程中找不到對應碼時,輸出此參數的值,若無設定則會參考base對照表的failed_code

description

(空字串)

此對照表的說明敘述。此處所撰寫的說明內容將出現在轉碼工具中,用以說明該對照表所表示的編碼。

Content 則是 CNS 碼與其他編碼的對照,每一列只有一組對照,每一組對照必須以 CNS 碼為開頭並且以「Tab空白(\t)」為分隔,
其格式為 cns_code native_code

CNS  Code

說明

01-4421      A440

01-4422      A441

01-4423      A442

01-4424      A443

01-4425      A444

01-4426      A445

對照表內容記錄CNS碼與其他編碼的對應關係。
範例表示CNS碼與Big5碼的對應關係

01-4421      A440表示
CNS
碼的01-4421對應
Big5
碼的A440

對照表載入以Map的型式建立Key:CNSValue:Code存入記憶體供快速查詢的table,無需再建立索引,省去大量索引的時間。

對照表檔案範例,將表頭資訊與對照內容組合起來如下:

#online:true

#name:ANSI(Big5)

#id:big5@big5

#type:bin

#pattern:

#base:

#failed_code:01-217B A1BC

#description:BIG5碼又稱為大五碼…

 

01-4421      A440

01-4422      A441

01-4423      A442

01-4424      A443

 

6. 範例程式:

  Case 01:文件轉碼之呼叫

   來源編碼格式:UTF-8 Unicode 5.2

   目的編碼格式:CSIC LS(正式)

   來源檔案路徑:D:/transferTest/normal/新文字文件.zip

   目的檔案路徑:D:/transferTest/result/新文字文件(結果).zip

   來源檔案:純文字檔的壓縮檔(ms950)

   不使用自訂來源對照表

   不使用自訂目的對照表

public class Client {

           private static String WSDL_FILE = "http://www.cns11643.gov.tw/CNSTransfer/services/TransferService?wsdl";

 

           public static void main(String[] args) throws IOException {

                     normalTest();

           }

 

           //  含文字檔的壓縮檔,不使用自訂對照表的 web service 轉碼

           private static void normalTest() throws IOException{

                     // 初始化 service 物件

                     TransferServiceStub stub = new TransferServiceStub(WSDL_FILE);

                     stub._getServiceClient().getOptions().setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);

                     TransferServiceStub.Transfer transfer = new TransferServiceStub.Transfer();

                     // 設定來源目的編碼格式

                     String srcFmt = "utf-8@unicode5_2";

                     String destFmt = "cns_ls@cns_ls";

                     transfer.setSrcFmt(srcFmt);

                     transfer.setDestFmt(destFmt);

                     // 載入文件並包入 DataHandler 物件

                     File docFile = new File("D:/transferTest/normal/新文字文件.zip");

                     DataHandler docDataHandler = new DataHandler(new FileDataSource(docFile));

                     transfer.setDocFileName(docFile.getName());

                     transfer.setDocDataHandler(docDataHandler);

                     // 載入壓縮檔並指定編碼格式

                     transfer.setUploadZipFileEncoding("ms950");// windows:ms950, linux:utf-8

                     // src 自訂對照表

                     transfer.setSrcTableFileName(null);

                     transfer.setSrcTableDataHandler(null);

                     // dest 自訂對照表

                     transfer.setDestTableFileName(null);

                     transfer.setDestTableDataHandler(null);

                     // 初始化回傳物件並寫入檔案

                     TransferResponse ret = stub.transfer(transfer);

                     DataHandler returnHandler = ret.get_return();

                     FileOutputStream fileOutPutStream = new FileOutputStream("D:/transferTest/result/新文字文件(結果).zip");

                     returnHandler.writeTo(fileOutPutStream); 

                     fileOutPutStream.flush(); 

                     fileOutPutStream.close();

           }

}

 

  Case 02:文字轉碼之呼叫

   來源編碼格式:UTF-8 Unicode 5.2

   目的編碼格式:CSIC LS(正式)

   來源文字:儲存到變數content

   目的文字:儲存到變數txt

   不使用自訂來源對照表

   不使用自訂目的對照表

public class ClientString {

           private static String WSDL_FILE = "http://www.cns11643.gov.tw/CNSTransfer/services/TransferService?wsdl";

          

           public static void main(String[] args) throws IOException {

                     normalStringTest();

           }

 

           // 一般文字,不使用自訂對照表的 web service 轉碼

           private static void normalStringTest() throws FileNotFoundException, RemoteException, UnsupportedEncodingException{

                     // 初始化 service 物件

                     TransferServiceStub stub = new TransferServiceStub(WSDL_FILE);

                      stub._getServiceClient().getOptions().setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);

                     TransferServiceStub.TransferString transferString = new TransferServiceStub.TransferString();

                     // 設定來源目的編碼格式

                     String srcFmt = "utf-8@unicode5_2";

                     String destFmt = "cns_ls@cns_ls";

                     transferString.setSrcFmt(srcFmt);

                     transferString.setDestFmt(destFmt);

                     // 取得byte資料型態的內文經base64編碼成字串傳入 web service

                     String content = file2base64("D:/transferTest/normal/新文字文件.txt");

                     transferString.setContent(content);

                     // 無自訂對照表

                     transferString.setSrcTableContent(null);

                     transferString.setDestTableContent(null);

                     // 初始化回傳物件並寫入檔案

                     TransferStringResponse returnValue = stub.transferString(transferString);

                     String[] result = returnValue.get_return();

                     Base64 base64 = new Base64();

                     String charset = result[0];

                     String txt = new String(base64.decode(result[1].getBytes()),charset);

                     String log = result[2];

                     String cns_tag = result[3];

                     String hex_txt = result[4]; // csic only

                     String path = "D:/transferTest/result/";

                     save(path+"test.txt", charset, txt);

                     save(path+"test_log.txt", null, log);

                     save(path+"test_cns_tag.txt", null, cns_tag);

                     save(path+"test_hex_txt.txt", null, hex_txt);

                     System.out.println("charset:"+charset);

                     System.out.println("txt:"+txt);

                     System.out.println("log:"+log);

                     System.out.println("cns_tag:"+cns_tag);

                     System.out.println("hex_txt"+hex_txt);

           }

 

           // 寫入檔案

           private static void save(String tarFileName, String charset, String content){

                     OutputStream out = null;

                     try {

                                charset = charset!=null && charset.length()>0?charset:"ms950";

                                byte[] data = content.getBytes(charset);

                                out=new FileOutputStream(new File(tarFileName));

                                if("utf-8".matches(charset))

                                           out.write(new byte[] {(byte)0xEF,(byte)0xBB,(byte)0xBF});

                                out.write(data, 0, data.length);

                                out.flush();

                                out.close();

                     } catch (Exception e) {

                                try {

                                           out.close();

                                           out = null;

                                } catch (Exception e1) {}

                     }

           }

           // 讀取檔案內容

           private static String file2string(String pathFileName, String charset){

                     BufferedReader in = null;

                     StringBuffer sb = new StringBuffer();

                     try{

                                in = new BufferedReader(new InputStreamReader(new FileInputStream(pathFileName),charset));

                                String readLine;

                                while((readLine=in.readLine())!=null){

                                           sb.append(sb.length()>0?"\r\n":"").append(readLine.trim());

                                }

                     }catch(Exception e){

                                e.printStackTrace();

                     }finally{

                                try{in.close();}catch(Exception e){}

                     }

                     return sb.toString();

           }

           // 將檔案內容經base64編碼成字串

           private static String file2base64(String pathFileName){

                     InputStream in = null;

                     ByteArrayOutputStream bao = new ByteArrayOutputStream();

                     StringBuffer sb = new StringBuffer();

                     byte[] srcBytes = null;

                     try{

                                in =new FileInputStream(pathFileName);

                                byte[] buf=new byte[4096];

                                int len;

                                while((len=in.read(buf))>0){

                                           bao.write(buf,0,len);

                                           bao.flush();

                                }

                                in.close();

                                bao.close();

                                int offset=0;

                                byte[] bytes = bao.toByteArray();

                                if(bytes.length>3 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF)

                                           offset+=3;//bom

                                else if(bytes.length>2+offset && (bytes[offset+0]==(byte)0xFE && bytes[offset+1]==(byte)0xFF)||(bytes[offset+0]==(byte)0xFF && bytes[offset+1]==(byte)0xFE))

                                           offset+=2;//be or le

                                srcBytes=new byte[bytes.length-offset];

                                System.arraycopy(bytes, offset, srcBytes, 0, bytes.length-offset);

                     }catch(Exception e){

                                e.printStackTrace();

                     }finally{

                                try{in.close();}catch(Exception e){}

                                try{bao.close();}catch(Exception e){}

                     }

                     return new String(new Base64().encode(srcBytes));

           }

}