Как я могу получить количество символов строки в Go?
Например, если у меня есть строка, "hello"
метод должен вернуться 5
. Я видел, что len(str)
возвращает количество байтов, а не количество символов, поэтому len("£")
возвращает 2 вместо 1, потому что в кодировке UTF-8 кодируется двумя байтами.
string
go
character
string-length
Аммар
источник
источник
Ответы:
Вы можете попробовать
RuneCountInString
из пакета utf8.что, как показано в этом сценарии : длина «Мира» может быть 6 (если написано по-китайски: «世界»), но число рун равно 2:
Фрозен добавляет в комментарии :
На самом деле вы можете делать
len()
руны, просто набирая тип.len([]rune("世界"))
напечатает2
. По латы в Go 1.3.И с CL 108985 (май 2018, для Go 1.11),
len([]rune(string))
теперь оптимизирован. ( Исправляет проблему 24923 )Компилятор
len([]rune(string))
автоматически обнаруживает шаблон и заменяет его на вызов r: = range s.Стефан Штайгер указывает на сообщение в блоге « Нормализация текста в Go »
Что такое персонаж?
Используя этот пакет и его
Iter
тип , фактическое количество символов будет:Здесь используется форма нормализации Unicode NFKD «Декомпозиция совместимости»
Oliver «s ответ указывает на UNICODE TEXT СЕГМЕНТАЦИИ как единственный способ надежно определить границы по умолчанию между некоторыми значительными элементами текста: пользовательские воспринимаемых символов, слов и фраз.
Для этого вам нужна внешняя библиотека, такая как rivo / uniseg , которая выполняет Unicode Text Segmentation .
Это фактически будет считать « кластер графем », где несколько кодовых точек могут быть объединены в один воспринимаемый пользователем символ.
Две графемы, хотя есть три руны (кодовые точки Unicode).
Вы можете увидеть другие примеры в " Как манипулировать строками в GO, чтобы обратить их вспять? "
👩🏾🦰 только одна графема, но, от юникода до конвертора кодовых точек , 4 руны:
источник
Есть способ получить количество рун без каких-либо пакетов, преобразовав строку в [] rune как
len([]rune(YOUR_STRING))
:источник
Многое зависит от вашего определения, что такое «характер». Если «руна равна персонажу» - это нормально для вашей задачи (как правило, это не так), тогда ответ от VonC идеально подходит для вас. В противном случае, вероятно, следует отметить, что существует несколько ситуаций, когда количество рун в строке Unicode является интересным значением. И даже в таких ситуациях лучше, если это возможно, вывести счетчик при «прохождении» строки во время обработки рун, чтобы избежать удвоения усилия декодирования UTF-8.
источник
String
«s.length()
метод не возвращает количество символов , либо. КакNSString
и-length
метод Какао . Они просто возвращают количество объектов UTF-16. Но истинное количество кодовых точек используется редко, потому что для его подсчета требуется линейное время.Если вам необходимо учитывать кластеры графем, используйте модуль регулярных выражений или кодировку Юникод. Подсчет количества кодовых точек (рун) или байтов также необходим для проверки, так как длина кластера графем не ограничена. Если вы хотите исключить очень длинные последовательности, проверьте, соответствуют ли последовательности потокобезопасному текстовому формату .
источник
var
вне функций.Есть несколько способов получить длину строки:
источник
Я должен отметить, что ни один из ответов, предоставленных до сих пор, не дает вам столько символов, сколько вы ожидаете, особенно когда вы имеете дело с эмодзи (но также и с некоторыми языками, такими как тайский, корейский или арабский). Предложения VonC выведут следующее:
Это потому, что эти методы учитывают только кодовые точки Unicode. Есть много символов, которые могут состоять из нескольких кодов.
То же самое для использования пакета нормализации :
Нормализация на самом деле не то же самое, что подсчет символов, и многие символы не могут быть нормализованы в эквивалент одной кодовой точки.
Ответ masakielastic подходит близко, но обрабатывает только модификаторы (радужный флаг содержит модификатор, который, таким образом, не считается его собственной кодовой точкой):
Правильный способ разделения строк Unicode на (воспринимаемые пользователем) символы, то есть кластеры графем, определен в Стандартном приложении Unicode № 29 . Правила можно найти в разделе 3.1.1 . Пакет github.com/rivo/uniseg реализует эти правила, чтобы вы могли определить правильное количество символов в строке:
источник
Я попытался сделать нормализацию немного быстрее:
источник