1. 取得SOAP協議的Web Service Server位置
/CNSTransfer/services/TransferService?wsdl
介面名稱 | 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時有值,其他編碼格式則不產生 |
介面名稱 | transferString |
---|---|
說明 | 提供字串轉碼,來源字串與目的字串都是以bytes資料型態經過base64編碼轉換而成的字串。回傳資料型態為字串陣列,長度為5,格式如下: 陣列0:編碼格式 陣列1:目的字串,以bytes資料型態 經過base64編碼轉換而成的字串 陣列2:轉碼過程之log資訊 陣列3:CNS 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資訊 陣列3:CNS Tag 陣列4:明碼,只有目的編碼設定為CSIC時有值, 其他編碼格式則回傳null |
下表為轉碼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 | 自訂 |
壓縮軟體在產生壓縮檔時,會使用作業系統預設的編碼格式進行壓縮,而解壓縮也必須使用同樣的編碼格式在能正確解壓縮,因此,需要設定此項參數轉碼Web Service才能正確解壓縮檔案
壓縮檔編碼格式 | 說明 |
---|---|
ms950 | 在Windows作業系統上產生壓縮檔所使用的編碼格式 |
utf-8 | 在Linux作業系統上產生壓縮檔所使用的編碼格式 |
null | 純文字檔,非壓縮檔 |
自訂對照表格式分成 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-8、utf-16le、utf-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=,正在處理的位元碼為0xBC77,則輸出錯誤資訊時value會被HEX位元碼的字串取代並輸出為 |
base | (空字串) | 表示此對照表繼承了另一個對照表的內容,若值為空字串,則表示此對照表沒有繼承別的對照表。 base的值為id的code_base,如: big5e對照表繼承了big5對照表的內容, big5對照表的id為big5@big5,code_base值為big5,則big5e對照表的base值為big5。反之,big5沒有繼承別的對照表,所以big5對照表的base值為空字串。 |
failed_code | (空字串) | 當設定檔outputFalidCode為true,轉碼過程中找不到對應碼時,輸出此參數的值,若無設定則會參考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:CNS,Value: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 |
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 = "/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); // 初始化回傳物件並寫入檔案 ransferResponse 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 = "/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)); } } |