Как получить количество символов в строке?
как я могу получить количество символов строки в Go?
например, если у меня есть строка "hello"
метод должен возвратить 5
. Я видел это len(str)
возвращает количество байт , а не количество символов len("£")
возвращает 2 вместо 1, потому что £ кодируется с двумя байтами в UTF-8.
1 ответ:
вы можете попробовать
RuneCountInString
из пакета utf8.возвращает количество рун в p
, что, как показано в этот скрипт: длина " мира "может быть 6 (когда написано на китайском языке:" 世界"), но его количество рун равно 2:
package main import "fmt" import "unicode/utf8" func main() { fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界")) }
С Phrozen добавляет в комментариях:
на самом деле вы можете сделать
len()
над рунами просто введите литье.len([]rune("世界"))
печати2
. По крайней мере, в Go 1.3.
и CL 108985 (май 2018, для Go 1.11),
len([]rune(string))
теперь оптимизирован. (Исправляет вопрос 24923)компилятор обнаруживает
len([]rune(string))
шаблон автоматически, и заменяет его на для вызова R: = range 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)
Стефан Штайгер указывает на сообщение в блоге"нормализация текста в Go"
что такое характер?
как было упомянуто в строки блоге,символы могут охватывать несколько рун.
Например,'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 "декомпозиция совместимости"