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.
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.
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.
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 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é.
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.
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>
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!