2021年11月16日 星期二

iTEXT罕字處理

 

中文字博大精深尤其是姓名的使用,為了命好而擇用特殊的文字組合或筆劃值也不算罕見,不過系統列印要處理這類就狀況百出。幾個步驟備忘來留念下
1. 編碼:不管是大五碼還是簡字總之先轉碼成UNICODE為先。
2.字型:大概率要找免費的比較好,全字庫是可以考慮的範圍,底下是拿細明體+細明體ExtB來做範例,因為全字庫的罕字分三層,感覺卡麻煩。

部分罕字/特殊字的字碼會在65535使用4byte來儲存,故判斷上就不能只取3Byte不然會對不上字元,另外罕字不可能單純出現在最前或最後也可能藏在中間或單字以上,故處理上得一字字處理,底下的Method送入inStr 原始Unicode字串回傳Paragraph餵給iText來顯示....

private Paragraph getExtName(String inStr) {
Paragraph simplePara = new Paragraph();
BaseFont bf_name = null;
int i_char = 0;
try {
bf_name = BaseFont.createFont("c:\\windows\\fonts\\mingliu.ttc,1", "Identity-H", BaseFont.NOT_EMBEDDED);

int getCode;
int start=0;
int end=0;
String getstr = "";
for(int j=0;j<inStr.length();j++) 
{
getCode = inStr.codePointAt(j);
start=j;
end=start+1;
if(getCode > 65535) {
   j++;
   end=start+2;
}
getstr = inStr.substring(start, end);
boolean tmpc  = bf_name.charExists(getCode);
if(tmpc) {
Chunk Chunkid0 = new Chunk(getstr, font12_name);
simplePara.add(Chunkid0);
i_char++;
} else {
tmpc  = bf_name_ext.charExists(getCode);
if(tmpc) {
Chunk Chunkid1 = new Chunk(getstr, font12_name_ext);
simplePara.add(Chunkid1);
i_char++;
}
}
}
        } catch (Exception ex) {
        i_char = 0;
        log.error(ex.toString());
        }

if (i_char == 0) {
Phrase simplePhr1 = new Phrase(inStr, font12_name);
simplePara.add(simplePhr1);
}
return simplePara;
}

2021年11月4日 星期四

EDC2POS communication

 電子商務的軟體服務,經常需要有與週邊構聯的需求,今天就EDC裝置來做個備忘,可能若干年後會改變但近幾年碰到都還是如此吧!!


首先從規格書上會告知這個裝置的連線設定與通訊電文(文法),得符合這些規則那裝置就會依照命令(Command)作相對應的反應。


STX, ETX, ACK均為ASCII表所規範之字碼,這部分處理需已Byte array方式來塞值傳遞,Encode 是ASCII


LRC碼是將欲傳送之電文位元組(Bytes)各Byte做XOR後的結果用於檢核用。


LRC Method Sample Code:


刷1元回傳的電文範本,依照規格書上的來去一項項對應,取需要的即可!!