Как получить количество символов в строке?


как я могу получить количество символов строки в Go?

например, если у меня есть строка "hello" метод должен возвратить 5. Я видел это len(str) возвращает количество байт , а не количество символов len("£") возвращает 2 вместо 1, потому что £ кодируется с двумя байтами в UTF-8.

1 94

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 "декомпозиция совместимости"