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.