आप RuneCountInString
utf8 पैकेज से कोशिश कर सकते हैं ।
पी में रन की संख्या देता है
जैसा कि इस लिपि में दर्शाया गया है : "विश्व" की लंबाई 6 हो सकती है (जब चीनी में लिखी गई हो: "世界"), लेकिन इसकी रन संख्या 2 है:
package main
import "fmt"
import "unicode/utf8"
func main() {
fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))
}
Phrozen टिप्पणियों में जोड़ता है :
वास्तव में आप len()
केवल टाइप कास्टिंग के द्वारा रन से अधिक कर सकते हैं ।
len([]rune("世界"))
छप जाएगा 2
। 1.3 गो में लीट पर।
और CL 108985 (मई 2018, गो 1.11 के लिए) के साथ, len([]rune(string))
अब अनुकूलित है। (फिक्स २४ ९ २३ जारी )
कंपाइलर len([]rune(string))
पैटर्न को स्वचालित रूप से पता लगाता है , और इसे r: = रेंज s कॉल के साथ बदल देता है।
एक स्ट्रिंग में रन को गिनने के लिए एक नया रनटाइम फ़ंक्शन जोड़ता है। कंपाइलर को पैटर्न का पता लगाने के लिए संशोधित करता है len([]rune(string))
और इसे नए रनिंग काउंटिंग रनटाइम फ़ंक्शन के साथ बदलता है।
RuneCount/lenruneslice/ASCII 27.8ns ± 2% 14.5ns ± 3% -47.70% (p=0.000 n=10+10)
RuneCount/lenruneslice/Japanese 126ns ± 2% 60ns ± 2% -52.03% (p=0.000 n=10+10)
RuneCount/lenruneslice/MixedLength 104ns ± 2% 50ns ± 1% -51.71% (p=0.000 n=10+9)
स्टीफन स्टीगर ब्लॉग पोस्ट "की ओर इशारा जाओ में पाठ सामान्य "
एक चरित्र क्या है?
जैसा कि स्ट्रिंग्स ब्लॉग पोस्ट में उल्लेख किया गया था , वर्ण कई रनों को फैला सकते हैं ।
उदाहरण के लिए, एक ' e
' और '◌́◌́' (तीव्र "\ u0301") e\u0301
NFD में 'é' (" ") बनाने के लिए संयोजन कर सकता है । एक साथ ये दो रन एक चरित्र हैं ।
एक चरित्र की परिभाषा आवेदन के आधार पर भिन्न हो सकती है।
के लिए सामान्य हम इसे के रूप में परिभाषित करेगा:
- रनर का एक क्रम, जो स्टार्टर से शुरू होता है,
- एक रनर जो किसी अन्य रनर के साथ पीछे की ओर संशोधित या संयोजित नहीं होता है,
- संभवतः गैर-शुरुआत के खाली अनुक्रम के बाद, अर्थात, रन (जो आमतौर पर उच्चारण करता है)।
सामान्यकरण एल्गोरिथ्म एक समय में एक चरित्र को संसाधित करता है।
उस पैकेज और उसके Iter
प्रकार का उपयोग करते हुए , "वर्ण" की वास्तविक संख्या होगी:
package main
import "fmt"
import "golang.org/x/text/unicode/norm"
func main() {
var ia norm.Iter
ia.InitString(norm.NFKD, "école")
nc := 0
for !ia.Done() {
nc = nc + 1
ia.Next()
}
fmt.Printf("Number of chars: %d\n", nc)
}
यहाँ, यह यूनिकोड सामान्यीकरण प्रपत्र NFKD "संगतता अपघटन" का उपयोग करता है
ओलिवर का उत्तर अंक कुछ महत्वपूर्ण पाठ तत्वों के बीच डिफ़ॉल्ट सीमाओं को मज़बूती से निर्धारित करने के एकमात्र तरीके के रूप में UNICODE TEXT SEGMENTATION को इंगित करता है: उपयोगकर्ता-कथित वर्ण, शब्द और वाक्य।
उसके लिए, आपको एक बाहरी लाइब्रेरी चाहिए जैसे कि rivo / यूनिसेग , जो यूनिकोड टेक्स्ट सेगमेंटेशन करता है ।
यह वास्तव में " ग्रैफेम क्लस्टर " की गणना करेगा , जहां कई कोड बिंदुओं को एक उपयोगकर्ता-माना चरित्र में जोड़ा जा सकता है।
package uniseg
import (
"fmt"
"github.com/rivo/uniseg"
)
func main() {
gr := uniseg.NewGraphemes("👍🏼!")
for gr.Next() {
fmt.Printf("%x ", gr.Runes())
}
// Output: [1f44d 1f3fc] [21]
}
दो अंगूर, भले ही तीन रन (यूनिकोड कोड पॉइंट) हों।
आप अन्य उदाहरणों में देख सकते हैं कि " उन्हें रिवर्स करने के लिए GO में स्ट्रिंग्स में हेरफेर कैसे करें? "
,👩🏾hem अकेले एक अंगूर है, लेकिन, यूनिकोड से कोड पॉइंट कनवर्टर तक , 4 रन: