Eine Funktion zum Abrufen der Anzahl von UTF-8-Bytes und -Zeichen in einer Sybase ASE-Zeichenfolge

Werfen wir einen Blick auf die Funktionen zum Ermitteln der Anzahl von UTF-8-Bytes und -Zeichen in Sybase ASE DBMS. Diese Funktion wurde in einem Projekt erstellt und verwendet, das EUC-KSC, eine Nicht-Unicode-Codierung von Sybase ASE, in UTF-8, eine Unicode-Codierung, konvertiert.

* UTF-8-Codierung Hinweis: UTF-8 – Wikipedia, die Enzyklopädie für alle (wikipedia.org)

Beim Konvertieren einer als varchar(10) deklarierten Spalte in EUC-KSC nach UTF-8 muss die maximale Anzahl von Bytes und Zeichen überprüft werden.

Beim Konvertieren in UTF-8 ist die maximale Anzahl von Bytes und Zeichen erforderlich, um zu bestimmen, wie viel die maximale Länge einer Zeichenfolgenspalte deklarieren soll. Diese Funktion wurde verwendet, um den Maximalwert zu berechnen, indem die Anzahl der Bytes und Zeichen, die in die UTF-8-Codierung konvertiert wurden, für den in der EUC-KSC-Codierung gespeicherten Wert berechnet wurde, der nicht die deklarierte Länge ist.

Das DBMS wurde auf Sybase ASE v15.5 getestet. Ich habe es nicht auf anderen Versionen getestet, aber ich denke, es sollte funktionieren.

Sybase ASE ist MS-SQL sehr ähnlich, sodass Sie es ohne Änderungen in MS-SQL verwenden können.

1. UTF-8-Byte-Zählfunktion

IF OBJECT_ID('dbo.GET_UTF8_BYTE') IS NOT NULL
  DROP FUNCTION dbo.GET_UTF8_BYTE
GO

CREATE FUNCTION dbo.GET_UTF8_BYTE
(
    @IN_VAL VARCHAR(4000)
)
RETURNS INT
AS
BEGIN
  DECLARE @CHK_LENGTH INT, @I INT, @CHK_BYTE INT, @BYTE_LEN INT, @UTF8_BYTE_LEN INT, @SUM_UTF8_BYTE_LEN INT

  SELECT @I = 1, @CHK_LENGTH = LEN(@IN_VAL), @SUM_UTF8_BYTE_LEN = 0

  WHILE @I <= @CHK_LENGTH
  BEGIN
    SELECT @CHK_BYTE = ASCII(SUBSTRING(@IN_VAL, @I, 1))

    IF @CHK_BYTE >= 128 -- ASCII 코드가 alpha, numeric, control 문자 범위를 넘는 경우(2 Byte 문자일 경우)
        SELECT @BYTE_LEN = 2, @UTF8_BYTE_LEN = 3
    ELSE
        SELECT @BYTE_LEN = 1, @UTF8_BYTE_LEN = 1

    SELECT @SUM_UTF8_BYTE_LEN = @SUM_UTF8_BYTE_LEN + @UTF8_BYTE_LEN, @I = @I + @BYTE_LEN
  END

  RETURN @SUM_UTF8_BYTE_LEN
END
GO

Dieser Code wurde basierend auf den folgenden Fakten geschrieben.

  • Wenn der ASCII-Code von Non-Unicode 1 Byte 128 oder höher ist, werden 2-Byte-Zeichen (Koreanisch, Chinesisch, Japanisch usw.)
  • Nicht-Unicode Hangul 1-Zeichen (2 Byte) werden als 3 Byte in UTF-8-Codierung gespeichert

Die Erklärung des Hauptcodes ist wie folgt.

  • Zeile 18: Lesen Sie den Eingabestring Byte für Byte.
  • Zeile 21: Legen Sie die Länge der zu überspringenden Bytes fest, wenn der ASCII-Code der gelesenen Bytes größer oder gleich 128 ist, erhöhen Sie die Anzahl der UTF-8-Bytes um 3
  • Zeile 23: Wenn der ASCII-Code der gelesenen Bytes kleiner als 128 ist, setzen Sie die Länge der zu überspringenden Bytes auf 1, erhöhen Sie die Anzahl der UTF-8-Bytes um 1
  • Zeile 25: Akkumulieren Sie die Summe der UTF-8-Bytes, erhöhen Sie den Wert der Bedingungsvariablen @I in der WHILE-Schleife um die Länge der zu überspringenden Bytes

2. Funktion zum Ermitteln der Anzahl der UTF-8-Zeichen

Die obige Funktion kann wie folgt geändert werden, um die Anzahl der Zeichen anstelle der Anzahl der UTF-8-Bytes zu erhalten.

IF OBJECT_ID('dbo.GET_CHAR_CNT') IS NOT NULL
  DROP FUNCTION dbo.GET_CHAR_CNT
GO

CREATE FUNCTION dbo.GET_CHAR_CNT
(
    @IN_VAL VARCHAR(4000)
)
RETURNS INT
AS
BEGIN
  DECLARE @CHK_LENGTH INT, @I INT, @CHK_BYTE INT, @BYTE_LEN INT, @UTF8_BYTE_LEN INT, @SUM_UTF8_BYTE_LEN INT, @SUM_CHAR_CNT INT

  SELECT @I = 1, @CHK_LENGTH = LEN(@IN_VAL), @SUM_UTF8_BYTE_LEN = 0, @SUM_CHAR_CNT = 0

  WHILE @I <= @CHK_LENGTH
  BEGIN
    SELECT @CHK_BYTE = ASCII(SUBSTRING(@IN_VAL, @I, 1))

    IF @CHK_BYTE >= 128 -- ASCII 코드가 alpha, numeric, control 문자 범위를 넘는 경우(2 Byte 문자일 경우)
        SELECT @BYTE_LEN = 2, @UTF8_BYTE_LEN = 3
    ELSE
        SELECT @BYTE_LEN = 1, @UTF8_BYTE_LEN = 1

    SELECT @SUM_UTF8_BYTE_LEN = @SUM_UTF8_BYTE_LEN + @UTF8_BYTE_LEN, @I = @I + @BYTE_LEN
    SELECT @SUM_CHAR_CNT = @SUM_CHAR_CNT + 1
  END

  --RETURN @SUM_UTF8_BYTE_LEN
  RETURN @SUM_CHAR_CNT
END

Die WHILE-Schleife ab Zeile 16 endet mit der @I-Variablen als Bedingung. Die Variable @BYTE_LEN wird je nach ASCII-Code des gelesenen Bytes auf 2 (Double-Byte-Zeichen) oder 1 (Single-Byte-Zeichen) gesetzt und in Zeile 25 zu @I hinzugefügt. Bei dieser Logik wird die WHILE-Schleife so oft wiederholt, wie die Anzahl der Zeichen entspricht.

Der Grund, warum @SUM_CHAR_CNT in Zeile 26 um 1 erhöht wird, ist, dass die Anzahl der Wiederholungen die Anzahl der Zeichen ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEDeutsch