Go では、文字列は文字シーケンスではなくバイト スライスとして扱われます。このため、文字列の反転などの文字レベルの操作を実行することが困難になる可能性があります。
次のシナリオを考えてみましょう。さまざまな長さ (100、100、 200、300、400、500)。各文字列の文字を反転したいと考えています。
Go では直接文字レベルを許可していないため、文字列内の異なるインデックスに文字を直接割り当てようとするとエラーが発生します。
Andrew Sellers は、その要旨の中で、発音区別記号 (CDM) とその他の複雑な Unicode 文字を組み合わせた Unicode を処理する革新的なアプローチを提供しています。
彼CDM の順序を検出して保存する手法を導入します。CDM は、文字列内の文字の結合に影響を与える複雑な Unicode ブロックの一部です。
この解決策には、文字列を反復処理することが含まれます。逆の順序で、範囲テーブルを使用して CDM を識別します。 CDM は保存され、反転された配列に追加される前に通常の文字と結合されます。
絵文字や修飾子のような文字の場合、このアプローチでは、文字を保持するために特別な考慮が必要です。要素の順序と、合成されたグリフの正しい表現。
これは、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 サイトの他の関連記事を参照してください。