Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membalikkan Rentetan dalam Go, Mengendalikan Unikod Menggabungkan Tanda Diakritik?

Bagaimana untuk Membalikkan Rentetan dalam Go, Mengendalikan Unikod Menggabungkan Tanda Diakritik?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 15:57:01136semak imbas

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

Memanipulasi Rentetan dalam Go: Panduan Terperinci untuk Membalikkan Aksara

Dalam Go, rentetan dianggap sebagai kepingan bait dan bukannya urutan aksara. Ini boleh menyukarkan untuk melaksanakan operasi peringkat aksara seperti menterbalikkan rentetan.

Memahami Masalah:

Mari kita pertimbangkan senario berikut: kita mempunyai beberapa rentetan aksara rawak dengan panjang yang berbeza-beza (100, 200, 300, 400, dan 500). Kami mahu menyongsangkan aksara setiap rentetan.

Cabaran:

Percubaan untuk menetapkan aksara terus kepada indeks berbeza dalam rentetan mengakibatkan ralat, kerana Go tidak membenarkan peringkat aksara langsung tugasan kepada rentetan.

Pertimbangan Unikod:

Andrew Sellers menyediakan pendekatan inovatif dalam intipatinya yang mengendalikan Unicode menggabungkan tanda diakritik (CDM) dan aksara Unikod kompleks lain.

Dia memperkenalkan teknik untuk mengesan dan mengekalkan susunan CDM, yang merupakan sebahagian daripada blok Unicode kompleks yang mempengaruhi gabungan aksara dalam rentetan.

Penyelesaian:

Penyelesaian melibatkan lelaran melalui rentetan dalam susunan terbalik dan mengenal pasti CDM menggunakan jadual julat. CDM disimpan, dan kemudian digabungkan dengan aksara biasa sebelum menambahkannya pada tatasusunan terbalik.

Mengendalikan Aksara Unikod Kompleks:

Untuk aksara seperti emoji dan pengubah suai, pendekatan memerlukan pertimbangan khusus untuk mengekalkan susunan elemen dan perwakilan yang betul bagi glif yang digubah.

Melaksanakan Penyelesaian dalam Go:

Berikut ialah coretan kod berdasarkan pendekatan 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>

Atas ialah kandungan terperinci Bagaimana untuk Membalikkan Rentetan dalam Go, Mengendalikan Unikod Menggabungkan Tanda Diakritik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn