আপনি RuneCountInString
utf8 প্যাকেজ থেকে চেষ্টা করতে পারেন ।
পি তে রুনসের সংখ্যা প্রদান করে
এই স্ক্রিপ্টে যেমন চিত্রিত হয়েছে : "ওয়ার্ল্ড" এর দৈর্ঘ্য 6 হতে পারে (যখন চীনা ভাষায় লেখা হয়: "世界") তবে এর রুন গণনা 2:
package main
import "fmt"
import "unicode/utf8"
func main() {
fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))
}
Phrozen যোগ মন্তব্য :
আসলে আপনি len()
কেবল castালাই টাইপ করে রুনসকে ওভার করতে পারেন ।
len([]rune("世界"))
মুদ্রণ করবে 2
। Go 1.3 এ লিজ এ।
এবং সিএল 108985 (মে 2018, Go 1.11 এর জন্য) len([]rune(string))
দিয়ে এখন অনুকূলিত হয়েছে। (সংশোধন ইস্যু 24923 )
সংকলক len([]rune(string))
স্বয়ংক্রিয়ভাবে প্যাটার্ন সনাক্ত করে এবং এটি r: = রেঞ্জের কলের জন্য প্রতিস্থাপন করে।
স্ট্রিংয়ে রানগুলি গণনা করতে একটি নতুন রানটাইম ফাংশন যুক্ত করে। প্যাটার্নটি সনাক্ত করতে সংকলকটি সংশোধন করে 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)
স্টিফান Steiger ব্লগ পোস্টে "থেকে পয়েন্ট যান পাঠ্য নিয়মমাফিককরণ "
একটি চরিত্র কি?
স্ট্রিং ব্লগ পোস্টে যেমন উল্লেখ করা হয়েছিল , অক্ষরগুলি একাধিক রুনে বিস্তৃত হতে পারে ।
উদাহরণস্বরূপ, একটি ' e
' এবং '◌́◌́' (তীব্র "\ u0301") একত্রিত হয়ে 'é' (এনএফডিতে "") গঠন করতে পারে e\u0301
। এই দুটি রুন একসাথে একটি চরিত্র ।
কোনও অক্ষরের সংজ্ঞা প্রয়োগের উপর নির্ভর করে পরিবর্তিত হতে পারে।
জন্য নিয়মমাফিককরণ আমরা এটা যেমন সংজ্ঞায়িত হবে:
- রুনসের ক্রম যা একটি স্টার্টার দিয়ে শুরু হয়,
- একটি রুন যা অন্য কোনও রুনের সাথে পিছনের দিকে সংশোধন বা সংযুক্ত করে না,
- এর পরে সম্ভবত অ-স্টার্টারদের খালি সিকোয়েন্সটি হয়, তা হয় যে রানগুলি (সাধারণত উচ্চারণ)।
নরমালাইজেশন অ্যালগরিদম সময়ে একটি অক্ষর প্রক্রিয়া করে।
সেই প্যাকেজটি এবং এর 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 "সামঞ্জস্যতা পচন" ব্যবহার করে
অলিভার এর উত্তর পয়েন্ট ইউনিকোড টেক্সট সেগমেন্টেশন ব্যবহারকারী-অনুভূত অক্ষর, শব্দ, এবং বাক্য: নির্ভরযোগ্যভাবে নির্দিষ্ট উল্লেখযোগ্য টেক্সট উপাদানের মধ্যে ডিফল্ট গণ্ডি নির্ণয় করার একমাত্র উপায় হিসাবে।
তার জন্য আপনার রিভো / ইউনিসেগের মতো একটি বাহ্যিক গ্রন্থাগার দরকার যা ইউনিকোড পাঠ্য বিভাগকে দেয় ।
এটি প্রকৃতপক্ষে " গ্রাফি ক্লাস্টার " গণনা করবে , যেখানে একাধিক কোড পয়েন্ট এক ব্যবহারকারী-অনুভূত অক্ষরে একত্রিত হতে পারে।
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]
}
দুটি গ্রাফিম, যদিও তিনটি রান রয়েছে (ইউনিকোড কোড পয়েন্ট)।
আপনি অন্যান্য উদাহরণ দেখতে পারেন " বারেই স্ট্রিং নিপূণভাবে কিভাবে তাদের বিপরীত কিভাবে? "
🦰🦰 একা এক গ্রাফিয়াম, তবে, ইউনিকোড থেকে কোড পয়েন্ট রূপান্তরকারী , 4 রান: