2011年5月25日 星期三

When you use ABAP to split a BIG5 string , how to make sure that you have no cut a word of BIG5 in half ?

當你用 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.


沒有留言:

張貼留言