指定の文字コードで文字を比較したい。

【ご質問】
 入力された文字をShift-JISで比較する方法はありますか?
 

【回答】
 {encode-characters}プロシージャを用いることで可能です。
 第一水準、第二水準の文字チェックも同プロシージャを用いることで可能です。 


|| Shift-JISの文字コードをバイト配列で返す
{define-proc {get-sjis-code tf:TextField}:ByteVec
    let encoding:CharEncoding = {get-character-encoding-by-name “shift-jis”}
    let code-out:ByteVec = {ByteVec max-size = tf.value.size * encoding.transcode-max-expansion-factor}
    let (in-used:int, out-made:int) = {encode-characters tf.value, code-out, encoding}
    {return code-out}
}

|| 第一引数が大なら1、第二引数が大なら-1、等しければ0を返す
{define-proc {compare byte1:ByteVec, byte2:ByteVec}:int
    let result:int = 0
    {output byte1.size & ” “ &  byte2.size}
    {if byte1.size > byte2.size then
        set result = 1
     elseif byte1.size < byte2.size then
        set result = -1
     else
        {for i:int = 0 below byte1.size do
            {if byte1[i] > byte2[i] then
                set result = 1
                {break}
             elseif byte1[i] < byte2[i] then
                set result = -1
                {break}
            }
        }
    }
    {return result}
}

{value
    def tf1 = {TextField width = 2cm, max-chars = 1, value = “あ”}
    def tf2 = {TextField width = 2cm, max-chars = 1, value = “A”}
    def cm = {CommandButton
                 label = “compare width Shift-jis”,
                 {on Action do                 
                     || Shift-JISでの比較を行います
                     def byte1 = {get-sjis-code tf1}
                     def byte2 = {get-sjis-code tf2}
                     def result = {compare byte1, byte2}
                     {popup-message
                         {if result > 0 then
                             “left is greater”
                          elseif result < 0 then
                             “right is greater”
                          else
                             “equal”
                         }
                     }
                 }
             }     
    {HBox
        tf1, tf2, cm
    }
}