Skip to main content
:::

全字庫 CNS111643

Home  \   Support   \   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資訊 陣列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

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-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

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 = "https://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 = "https://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)); } }