AppExpert

式での文字セットの指定

Citrix ADCアプライアンスのポリシーインフラストラクチャでは、ASCIIおよびUTF-8文字セットがサポートされています。デフォルトの文字セットは ASCII です。式を設定するトラフィックが ASCII 文字だけで構成されている場合は、式に文字セットを指定する必要はありません。アプライアンスは、バイナリ文字を含むすべての文字列リテラルと文字リテラルを許可します。ただし、UTF-8 文字セットでは、文字列リテラルと文字リテラルが有効な UTF-8 である必要があります。

CLIENT.TCP.PAYLOAD(100).CONTAINS("\xff\x02")

式では、SET_CHAR_SET () 関数を式のポイントで導入する必要があります。このポイント以降は、指定した文字セットでデータ処理を実行する必要があります。たとえば、式 HTTP.REQ.BODY (1000) .AFTER_REGEX (再/次の例/) .BEFORE_REGEX (前の例/) .CONTAINS_ANY (「ギリシャ_アルファベット」) で、パターンセット「ギリシャ_アルファベット」に格納されている文字列が UTF-8 の場合、SET_CHAR_SET を含める必要があります。(UTF_8) 関数<string>次のように、CONTAINS_ANY (」「) 関数の直前に記述します。

HTTP.REQ.BODY(1000).AFTER_REGEX(re/following example/).BEFORE_REGEX(re/In the preceding example/).SET_CHAR_SET(UTF_8).CONTAINS_ANY("Greek_ alphabet")

SET_CHAR_SET () 関数は、後でその文字セットを変更する別の SET_CHAR_SET () 関数によって上書きされない限り、式内の以降のすべての処理 (つまり、後続のすべての関数) の文字セットを設定します。したがって、特定の単純な式のすべての関数が UTF-8 用である場合は、テキストを識別する関数 (HEADER (」<name>「) または BODY () 関数など) の直後に SET_CHAR_SET (UTF_8 <int>) 関数を含めることができます。上記の最初の段落に続く 2 番目の例では、AFTER_REGEX () 関数および BEFORE_REGEX () 関数に渡された ASCII 引数が UTF-8 文字列に変更された場合、次のように、BODY (1000) 関数の直後に SET_CHAR_SET (UTF_8) 関数を含めることができます。

HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).AFTER_REGEX(re/Bücher/).BEFORE_REGEX(re/Wörterbuch/).CONTAINS_ANY("Greek_alphabet")

UTF-8 文字セットは ASCII 文字セットのスーパーセットなので、文字セットを UTF-8 に変更しても、ASCII 文字セットに設定された式は期待どおりに動作し続けます。

異なる文字セットを持つ複合式

複合式では、式の 1 つのサブセットが ASCII 文字セットのデータを操作するように設定され、残りの式が UTF-8 文字セットのデータを操作するように設定されている場合、式が評価されるときに、各式に指定された文字セットが考慮されます。を個別に設定できます。ただし、複合式を処理する場合、演算子を処理する直前に、アプライアンスは返される ASCII 値の文字セットを UTF-8 に昇格させます。たとえば、次の複合式では、最初の単純な式は ASCII 文字セットのデータを評価し、2 番目の単純な式は UTF-8 文字セットのデータを評価します。

HTTP.REQ.HEADER("MyHeader") == HTTP.REQ.BODY(10).SET_CHAR_SET(UTF_8)

ただし、複合式を処理する場合、「等しい」ブール演算子を評価する直前に、Citrix ADCアプライアンスは、HTTP.REQ.HEADER(「MyHeader」)によって返される値の文字セットをUTF-8に昇格させます。

次の例の最初の単純な式は、ASCII 文字セットのデータを評価します。ただし、Citrix ADCアプライアンスが複合式を処理する場合、2つの単純な式の結果を連結する直前に、アプライアンスはHTTP.REQ.BODY (10) から返される値の文字セットをUTF-8に昇格させます。

HTTP.REQ.BODY(10) + HTTP.REQ.HEADER("MyHeader").SET_CHAR_SET(UTF_8)

したがって、複合式は UTF-8 文字セットのデータを返します。

トラフィックの文字セットに基づいて文字セットを指定する

トラフィックの特性に基づいて、文字セットを UTF-8 に設定できます。評価されるトラフィックの文字セットが UTF-8 であるかどうかがわからない場合は、最初の式が UTF-8 トラフィックをチェックし、後続の式が文字セットを UTF-8 に設定する複合式を設定できます。次に、リクエストの最初の 1000 バイトに UTF-8 文字列 Bücher が含まれているかどうかをチェックする前に、リクエストの Content-Type ヘッダーの「charset」の値を最初にチェックする複合式の例を示します。

HTTP.REQ.HEADER("Content-Type").SET_TEXT_MODE(IGNORECASE).TYPECAST_NVLIST_T('=', '; ', '"').VALUE("charset").EQ("UTF-8") && HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).CONTAINS("Bücher")

評価されるトラフィックの文字セットが UTF-8 であると確信できる場合は、例の 2 番目の式で十分です。

式内の文字および文字列リテラル

式の評価中に、現在の文字セットが ASCII であっても、文字リテラルと文字列リテラルは、それぞれ一重引用符 (‘’) と引用符 (「」) で囲まれており、UTF-8 文字セットではリテラルと見なされます。特定の式で、関数が ASCII 文字セットの文字リテラルまたは文字列リテラルで動作していて、リテラルに ASCII 以外の文字が含まれている場合、エラーが返されます。

高度なポリシー式の文字列リテラルは、ポリシー式と同じ長さになりました。式は、1499 バイトまたは 8191 バイトの長さにすることができます。

16 進数および 8 進数形式の値

式を設定する場合、8 進数および 16 進数の形式で値を入力できます。ただし、各 16 進数または 8 進数バイトは UTF-8 バイトと見なされます。無効な UTF-8 バイトは、値を手動で入力するか、クリップボードから貼り付けるかにかかわらず、エラーになります。たとえば、「xcex20」は、「c8」の後に「20」を続けることができないため、無効な UTF-8 文字です (マルチバイトの UTF-8 文字列の各バイトには上位ビットが設定されている必要があります)。無効な UTF-8 文字のもう 1 つの例は「xce xa9」です。これは、16 進文字は空白文字で区切られているためです。

UTF-8 文字列を返す関数

text>.XPATH<text>.XPATH_JSON 関数のみが常に UTF-8 文字列を返します。次の MYSQL ルーチンは、プロトコル内のデータに応じて、実行時にどの文字セットを返すかを決定します。

  • MYSQL_CLIENT_T.USER
  • MYSQL_CLIENT_T.DATABASE
  • MYSQL_REQ_QUERY_T.COMMAND
  • MYSQL_REQ_QUERY_T.TEXT
  • MYSQL_REQ_QUERY_T.TEXT(<unsigned int>)
  • MYSQL_RES_ERROR_T.SQLSTATE
  • MYSQL_RES_ERROR_T.MESSAGE
  • MYSQL_RES_FIELD_T.CATALOG
  • MYSQL_RES_FIELD_T.DB
  • MYSQL_RES_FIELD_T.TABLE
  • MSQL_RES_FIELD_T.ORIGINAL_TABLE
  • MYSQL_RES_FIELD_T.NAME
  • MYSQL_RES_FIELD_T.ORIGINAL_NAME
  • MYSQL_RES_OK_T.MESSAGE
  • MYSQL_RES_ROW_T.TEXT_ELEM(<unsigned int>)

UTF-8 の端末接続設定

ターミナル接続(PuTTYなどを使用して)を使用してCitrix ADCアプライアンスへの接続を設定する場合は、データの転送に使用する文字セットをUTF-8に設定する必要があります。

高度なポリシー式の最小関数と最大関数

高度なポリシー式では、以下の最小関数と最大関数がサポートされています。

  1. (<expression1>.max(<expression2>) -2つの値の最大値を返します。
  2. (<expression1>.min(<expression2>) -2つの値の最小値を返します。