sql >> Base de Datos >  >> RDS >> Oracle

La mejor manera de acortar la cadena UTF8 en función de la longitud de bytes

Aquí hay dos soluciones posibles:un LINQ de una sola línea que procesa la entrada de izquierda a derecha y un for tradicional -bucle procesando la entrada de derecha a izquierda. La dirección de procesamiento más rápida depende de la longitud de la cadena, la longitud de bytes permitida y el número y la distribución de caracteres multibyte, y es difícil dar una sugerencia general. La decisión entre LINQ y el código tradicional probablemente sea una cuestión de gusto (o tal vez de velocidad).

Si la velocidad es importante, uno podría pensar en simplemente acumular la longitud en bytes de cada carácter hasta alcanzar la longitud máxima en lugar de calcular la longitud en bytes de toda la cadena en cada iteración. Pero no estoy seguro de si esto funcionará porque no conozco la codificación UTF-8 lo suficientemente bien. En teoría, podría imaginar que la longitud en bytes de una cadena no es igual a la suma de las longitudes en bytes de todos los caracteres.

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;
}