Maison > développement back-end > Golang > Comment inverser une chaîne en Go, en gérant Unicode combinant des signes diacritiques ?

Comment inverser une chaîne en Go, en gérant Unicode combinant des signes diacritiques ?

Mary-Kate Olsen
Libérer: 2024-10-27 15:57:01
original
242 Les gens l'ont consulté

How to Reverse a String in Go, Handling Unicode Combining Diacritical Marks?

Manipulation de chaînes dans Go : un guide détaillé pour inverser les caractères

Dans Go, les chaînes sont traitées comme des tranches d'octets plutôt que comme des séquences de caractères. Cela peut rendre difficile l'exécution d'opérations au niveau des caractères, comme l'inversion de chaînes.

Comprendre le problème :

Considérons le scénario suivant : nous avons plusieurs chaînes de caractères aléatoires de longueurs variables (100, 200, 300, 400 et 500). Nous voulons inverser les caractères de chaque chaîne.

Le défi :

Les tentatives d'attribuer des caractères directement à différents indices dans la chaîne entraînent une erreur, car Go n'autorise pas l'affectation directe des caractères au niveau des caractères. affectation aux chaînes.

Considérations sur Unicode :

Andrew Sellers propose une approche innovante dans son essence qui gère Unicode combinant des signes diacritiques (CDM) et d'autres caractères Unicode complexes.

Il introduit une technique pour détecter et préserver l'ordre des CDM, qui font partie d'un bloc Unicode complexe qui affecte la combinaison de caractères dans une chaîne.

La solution :

La solution consiste à parcourir la chaîne dans l’ordre inverse et en identifiant les MDP à l’aide d’un tableau de plages. Les CDM sont stockés, puis combinés avec des caractères normaux avant de les ajouter au tableau inversé.

Gestion des caractères Unicode complexes :

Pour les caractères tels que les emojis et les modificateurs, l'approche nécessite une attention particulière pour préserver le ordre des éléments et représentation correcte des glyphes composés.

Implémentation de la solution dans Go :

Voici un extrait de code basé sur l'approche d'Andrew Sellers :

<code class="go">package main

import (
    "fmt"
    "os"
    "runtime"
    "unicode"
)

func main() {
    var stringsToReverse = []string{"Hello, World", "??⃠?", "??‍?????‍⚖️", "aͤoͧiͤ  š́ž́ʟ́", "H̙̖ell͔o̙̟͚͎̗̹̬ ̯W̖͝ǫ̬̞̜rḷ̦̣̪d̰̲̗͈"}
    for _, s := range stringsToReverse {
        fmt.Printf("Reverse '%s' => '%s'\n", s, ReverseString(s))
    }

    fmt.Printf("Memory usage: %d bytes\n", runtime.MemStats.Alloc)
    os.Exit(0)
}

// ReverseString reverses the characters in a string, handling Unicode combining diacritical marks
func ReverseString(s string) string {
    sv := []rune(s)
    cv := make([]rune, 0)
    rv := make([]rune, 0)

    for ix := len(sv) - 1; ix >= 0; ix-- {
        r := sv[ix]
        if unicode.In(r, combining) {
            cv = append(cv, r)
            fmt.Printf("Detect combining diacritical mark ' %c'\n", r)
        } else {
            rrv := make([]rune, 0, len(cv)+1)
            rrv = append(rrv, r)
            rrv = append(rrv, cv...)
            fmt.Printf("regular mark '%c' (with '%d' combining diacritical marks '%s') => '%s'\n", r, len(cv), string(cv), string(rrv))
            rv = append(rv, rrv...)
            cv = make([]rune, 0)
        }
    }

    return string(rv)
}</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal