當你用 ABAP 在分割或刪減包含有 BIG5 的字串時,如何確認你沒有把一個 BIG5 的字切成一半?
首先我們要知道 BIG5 的編號規則,BIG5 是 2 bytes code ,分為 High Byte 和 Low Byte:
* =========== ===========
* High Byte Low Byte
* =========== ===========
* 0xA1-0xF9 0x40-0x7E
* or
* 0xA1-0xFE
* =========== ===========
依照其編碼規則我們可以發現 high byte 和 low byte 有重疊的部份就是 0xA1-0xF9 的區間,底下的程式假設將一個長字串縮減成 30 個字元,然後判斷最後一個字元是否有將 BIG5 的文字切成一半:
DATA: lv_strlen TYPE i,
lv_chars(30) TYPE c,
lv_char(2) TYPE c,
lv_rightoff TYPE i,
lv_rightpos TYPE i,
lv_big5hs(1) TYPE x VALUE 'A1', " Big5 High Byte Start
lv_big5he(1) TYPE x VALUE 'F9'. " Big5 High Byte End
FIELD-SYMBOLS: <asc> TYPE x.
lv_rightoff = 1.
lv_rightpos = 29.
WRITE lv_sheetname(*) TO lv_chars
DO.
ASSIGN lv_chars+lv_rightpos(1) TO <asc> CASTING.
IF <asc> GE lv_big5hs AND " Big5 High Byte code's range
<asc> LE lv_big5he.
IF lv_rightoff = 1.
lv_rightoff = 2.
ELSE.
lv_rightoff = 1.
ENDIF.
lv_rightpos = lv_rightpos - 1.
CONTINUE. " Check previous byte
ELSEIF lv_rightoff EQ 2.
lv_rightoff = 1. " Confirm cut at big5 word
EXIT.
ENDIF.
CLEAR lv_rightoff. " Confirm NOT cut at big5 word
EXIT.
ENDDO.
IF lv_rightoff GT 0.
WRITE lv_sheetname(29) TO lv_chars.
ENDIF.
沒有留言:
張貼留言