sql >> Database teknologi >  >> RDS >> Oracle

Bedste måde at forkorte UTF8 streng baseret på byte længde

Her er to mulige løsninger - en LINQ one-liner, der behandler input fra venstre mod højre og en traditionel for -loop behandler input fra højre mod venstre. Hvilken behandlingsretning der er hurtigere afhænger af strenglængden, den tilladte byte-længde og antallet og fordelingen af ​​multibyte-tegn, og det er svært at give et generelt forslag. Beslutningen mellem LINQ og traditionel kode er nok et spørgsmål om smag (eller måske hastighed).

Hvis hastigheden betyder noget, kunne man tænke på bare at akkumulere byte-længden af ​​hvert tegn, indtil man når den maksimale længde i stedet for at beregne byte-længden af ​​hele strengen i hver iteration. Men jeg er ikke sikker på, om dette vil virke, fordi jeg ikke kender UTF-8-kodning godt nok. Jeg kunne teoretisk forestille mig, at byte-længden af ​​en streng ikke er lig med summen af ​​byte-længderne af alle tegn.

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


  1. Få den sidste dag i måneden i PostgreSQL

  2. Hvordan får man tabelscript i Oracle SQL Developer?

  3. Er lig med (=) vs. LIKE for datodatatype

  4. Sådan konverteres en normal forespørgsel til en krydstabuleringsforespørgsel i Access