Festlegen des Zeichensatzes in Ausdrücken

Die Richtlinieninfrastruktur der Citrix® Citrix ADC® -Appliance unterstützt die ASCII- und UTF-8-Zeichensätze. Der Standardzeichensatz ist ASCII. Wenn der Datenverkehr, für den Sie einen Ausdruck konfigurieren, nur aus ASCII-Zeichen besteht, müssen Sie den Zeichensatz im Ausdruck nicht angeben. Sie müssen jedoch den Zeichensatz in jedem einfachen Ausdruck angeben, der für UTF-8-Datenverkehr gedacht ist. Um den UTF-8-Zeichensatz in einem einfachen Ausdruck anzugeben, müssen Sie die <charset> Funktion SET_CHAR_SET () einschließen, die <charset> als UTF_8 angegeben wird, wie in den folgenden Beispielen gezeigt:

HTTP.REQ.BODY(10).SET_CHAR_SET(UTF_8).CONTAINS("ß")

HTTP.RES.BODY(100).SET_CHAR_SET(UTF_8).BEFORE_STR("Bücher").AFTER_STR("Wörterbuch")

In einem Ausdruck muss die Funktion SET_CHAR_SET () an der Stelle des Ausdrucks eingeführt werden, nach der die Datenverarbeitung im angegebenen Zeichensatz durchgeführt werden muss. Beispielsweise müssen Sie im Ausdruck HTTP.REQ.BODY (1000) .AFTER_REGEX (re/folgendes Beispiel/) .BEFORE_REGEX (re/im vorhergehenden Beispiel/) .CONTAINS_ANY (Greek_ alphabet), wenn die im Mustersatz Greek_alphabet gespeicherten Strings in UTF-8 enthalten sind, die SET_CHAR_SET (UTF_8) Funktion unmittelbar vor der <string> Funktion CONTAINS_ANY ( ) wie folgt:

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")

Die Funktion SET_CHAR_SET () setzt den Zeichensatz für die weitere Verarbeitung (d. h. für alle nachfolgenden Funktionen) im Ausdruck, es sei denn, er wird später im Ausdruck durch eine andere SET_CHAR_SET () -Funktion überschrieben, die den Zeichensatz ändert. Wenn also alle Funktionen eines bestimmten einfachen Ausdrucks für UTF-8 vorgesehen sind, können Sie die Funktion SET_CHAR_SET (UTF_8) unmittelbar nach Funktionen einschließen, die Text identifizieren (z. B. die <name> <int> Funktionen HEADER ( ) oder BODY ()). Wenn die ASCII-Argumente, die an die Funktionen AFTER_REGEX () und BEFORE_REGEX () übergeben werden, in UTF-8-Zeichenfolgen geändert werden, können Sie die Funktion SET_CHAR_SET (UTF_8) unmittelbar nach der Funktion BODY (1000) wie folgt einschließen:

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

Der UTF-8-Zeichensatz ist eine Obermenge des ASCII-Zeichensatzes. Daher funktionieren Ausdrücke, die für den ASCII-Zeichensatz konfiguriert sind, wie erwartet, wenn Sie den Zeichensatz in UTF-8 ändern.

Zusammengesetzte Ausdrücke mit verschiedenen Zeichensätzen

Wenn in einem zusammengesetzten Ausdruck eine Teilmenge von Ausdrücken so konfiguriert ist, dass sie mit Daten im ASCII-Zeichensatz arbeitet und die restlichen Ausdrücke so konfiguriert sind, dass sie mit Daten im UTF-8-Zeichensatz arbeiten, wird der für jeden einzelnen Ausdruck angegebene Zeichensatz berücksichtigt, wenn die Ausdrücke ausgewertet werden einzeln. Bei der Verarbeitung des zusammengesetzten Ausdrucks wird jedoch kurz vor der Verarbeitung der Operatoren der Zeichensatz der zurückgegebenen ASCII-Werte auf UTF-8 heraufstuft. Beispiel: Im folgenden zusammengesetzten Ausdruck wertet der erste einfache Ausdruck Daten im ASCII-Zeichensatz aus, während der zweite einfache Ausdruck Daten im UTF-8-Zeichensatz auswertet:

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

Bei der Verarbeitung des zusammengesetzten Ausdrucks wird jedoch kurz vor der Auswertung des booleschen Operators is equal to die Citrix ADC Appliance den Zeichensatz des von HTTP.REQ.HEADER (MyHeader) zurückgegebenen Werts zu UTF-8 heraufstuft.

Der erste einfache Ausdruck im folgenden Beispiel wertet Daten im ASCII-Zeichensatz aus. Wenn die Citrix ADC Appliance den zusammengesetzten Ausdruck jedoch unmittelbar vor dem Verketten der Ergebnisse der beiden einfachen Ausdrücke verarbeitet, fördert die Appliance den Zeichensatz des von HTTP.REQ.BODY (10) zurückgegebenen Werts zu UTF-8.

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

Folglich gibt der zusammengesetzte Ausdruck Daten im UTF-8-Zeichensatz zurück.

Festlegen des Zeichensatzes basierend auf dem Zeichensatz des Datenverkehrs

Sie können den Zeichensatz anhand der Traffic-Merkmale auf UTF-8 setzen. Wenn Sie nicht sicher sind, ob der Zeichensatz des ausgewerteten Datenverkehrs UTF-8 ist, können Sie einen zusammengesetzten Ausdruck konfigurieren, in dem der erste Ausdruck auf UTF-8-Datenverkehr überprüft und nachfolgende Ausdrücke den Zeichensatz auf UTF-8 setzen. Es folgt ein Beispiel für einen zusammengesetzten Ausdruck, der zuerst den Wert von charset im Content-Type-Header der Anforderung für UTF-8 überprüft, bevor überprüft wird, ob die ersten 1000 Bytes in der Anforderung die UTF-8-Zeichenfolge Bücher enthalten:

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")

Wenn Sie sicher sind, dass der Zeichensatz des ausgewerteten Datenverkehrs UTF-8 ist, ist der zweite Ausdruck im Beispiel ausreichend.

Zeichen- und Zeichenfolgenliterale in Ausdrücken

Auch wenn der aktuelle Zeichensatz ASCII ist, werden während der Ausdrucksauswertung Zeichenliterale und Zeichenfolgenliterale, die in einfache Anführungszeichen (‘) und Anführungszeichen () eingeschlossen sind, als Literale im UTF-8-Zeichensatz betrachtet. Wenn in einem bestimmten Ausdruck eine Funktion für Zeichen- oder Zeichenfolgenliterale im ASCII-Zeichensatz arbeitet und Sie ein Nicht-ASCII-Zeichen in das Literal einfügen, wird ein Fehler zurückgegeben.

Hinweis:

Die Zeichenfolgenliterale in erweiterten Richtlinienausdrücken sind jetzt so lang wie der Richtlinienausdruck. Der Ausdruck darf 1499 oder 8191 Byte lang sein.

Werte im Hexadezimal- und Oktalformat

Beim Konfigurieren eines Ausdrucks können Sie Werte in oktaler und hexadezimaler Form eingeben. Jedes hexadezimale oder oktales Byte gilt jedoch als UTF-8-Byte. Ungültige UTF-8-Bytes führen zu Fehlern, unabhängig davon, ob der Wert manuell eingegeben oder aus der Zwischenablage eingefügt wird. Beispiel: “\xce\x20” ist ein ungültiges UTF-8-Zeichen, da “c8” nicht von “20” gefolgt werden kann (jedes Byte in einem Multi-Byte-UTF-8-String muss das hohe Bit gesetzt haben). Ein weiteres Beispiel für ein ungültiges UTF-8-Zeichen ist xce xa9, da die hexadezimalen Zeichen durch ein Leerzeichen getrennt sind.

Funktionen, die UTF-8-Strings zurückgeben

Nur die Funktionen <text>.XPATH and <text>.XPATH_JSON eben immer UTF-8-Zeichenfolgen zurück. Die folgenden MYSQL-Routinen bestimmen zur Laufzeit, welcher Zeichensatz zurückgegeben werden soll, abhängig von den Daten im Protokoll:

  • 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
  • MYSQL_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>)

Terminalverbindungseinstellungen für UTF-8

Wenn Sie eine Verbindung zur Citrix ADC Appliance mithilfe einer Terminalverbindung (z. B. mithilfe von PuTTY) einrichten, müssen Sie den Zeichensatz für die Übertragung von Daten an UTF-8 festlegen.

## Minimale und maximale Funktionen in einem erweiterten Richtlinienausdruck

Die erweiterten Richtlinienausdrücke unterstützen die unten aufgeführten Mindest- und Maximalfunktionen.

  1. (<expression1>.max(<expression2>) - gibt das Maximum der beiden Werte zurück.
  2. (<expression1>.min(<expression2>) - gibt das Minimum der beiden Werte zurück.