Go で文字列を反転し、発音区別記号を組み合わせた Unicode を処理する方法は?

Mary-Kate Olsen
リリース: 2024-10-27 15:57:01
オリジナル
136 人が閲覧しました

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

Go での文字列の操作: 文字を反転するための詳細ガイド

Go では、文字列は文字シーケンスではなくバイト スライスとして扱われます。このため、文字列の反転などの文字レベルの操作を実行することが困難になる可能性があります。

問題の理解:

次のシナリオを考えてみましょう。さまざまな長さ (100、100、 200、300、400、500)。各文字列の文字を反転したいと考えています。

課題:

Go では直接文字レベルを許可していないため、文字列内の異なるインデックスに文字を直接割り当てようとするとエラーが発生します。

Unicode に関する考慮事項:

Andrew Sellers は、その要旨の中で、発音区別記号 (CDM) とその他の複雑な Unicode 文字を組み合わせた Unicode を処理する革新的なアプローチを提供しています。

彼CDM の順序を検出して保存する手法を導入します。CDM は、文字列内の文字の結合に影響を与える複雑な Unicode ブロックの一部です。

解決策:

この解決策には、文字列を反復処理することが含まれます。逆の順序で、範囲テーブルを使用して CDM を識別します。 CDM は保存され、反転された配列に追加される前に通常の文字と結合されます。

複雑な Unicode 文字の処理:

絵文字や修飾子のような文字の場合、このアプローチでは、文字を保持するために特別な考慮が必要です。要素の順序と、合成されたグリフの正しい表現。

Go でのソリューションの実装:

これは、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>
ログイン後にコピー

以上がGo で文字列を反転し、発音区別記号を組み合わせた Unicode を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!