Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Beste Möglichkeit, UTF8-Strings basierend auf der Bytelänge zu kürzen

Hier sind zwei mögliche Lösungen – ein LINQ-Einzeiler, der die Eingabe von links nach rechts verarbeitet, und ein herkömmliches for -Schleife verarbeitet die Eingabe von rechts nach links. Welche Verarbeitungsrichtung schneller ist, hängt von der Stringlänge, der erlaubten Bytelänge und der Anzahl und Verteilung der Multibyte-Zeichen ab und lässt sich nur schwer pauschal sagen. Die Entscheidung zwischen LINQ und traditionellem Code ist wohl Geschmackssache (oder vielleicht Geschwindigkeit).

Wenn es auf Geschwindigkeit ankommt, könnte man darüber nachdenken, einfach die Bytelänge jedes Zeichens zu akkumulieren, bis die maximale Länge erreicht ist, anstatt die Bytelänge der gesamten Zeichenfolge in jeder Iteration zu berechnen. Aber ich bin mir nicht sicher, ob das funktionieren wird, weil ich die UTF-8-Codierung nicht gut genug kenne. Ich könnte mir theoretisch vorstellen, dass die Bytelänge eines Strings nicht gleich der Summe der Bytelängen aller Zeichen ist.

public static String LimitByteLength(String input, Int32 maxLength)
{
    return new String(input
        .TakeWhile((c, i) =>
            Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
        .ToArray());
}

public static String LimitByteLength2(String input, Int32 maxLength)
{
    for (Int32 i = input.Length - 1; i >= 0; i--)
    {
        if (Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
        {
            return input.Substring(0, i + 1);
        }
    }

    return String.Empty;
}