Вызов Character.isLetter(c)
возвращается, true
если символ является буквой. Но есть ли способ быстро определить, String
содержит ли a только базовые символы ASCII?
источник
Вызов Character.isLetter(c)
возвращается, true
если символ является буквой. Но есть ли способ быстро определить, String
содержит ли a только базовые символы ASCII?
Начиная с Guava 19.0 и далее, вы можете использовать:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
При этом используется matchesAllOf(someString)
метод, основанный на фабричном методе, ascii()
а не на устаревшем ASCII
синглтоне.
Здесь ASCII включает все символы ASCII, включая непечатаемые символы ниже 0x20
(пробела), такие как табуляция, перевод строки / возврат, но также BEL
с кодом 0x07
и DEL
с кодом 0x7F
.
В этом коде неправильно используются символы, а не кодовые точки, даже если кодовые точки указаны в комментариях к более ранним версиям. К счастью, символы, необходимые для создания кодовой точки со значением U+010000
или больше, используют два суррогатных символа со значением вне диапазона ASCII. Таким образом, этот метод по-прежнему успешно тестирует ASCII даже для строк, содержащих эмодзи.
Для более ранних версий Guava без ascii()
метода вы можете написать:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
устарел и будетВы можете сделать это с помощью java.nio.charset.Charset .
Обнаружение не-ASCII-символа в строке
источник
StandardCharsets.US_ASCII
вместоCharset.forName("US-ASCII")
.StandardCharsets
? Я мог бы опубликовать другой ответ, но я бы предпочел исправить этот высоко оцененный ответ.Вот еще один способ, не зависящий от библиотеки, а с использованием регулярного выражения.
Вы можете использовать эту единственную строку:
Полный пример программы:
источник
\P{Print}
и\P{Graph}
+ описание? Зачем тебе\A
и\z
?Выполните итерации по строке и убедитесь, что все символы имеют значение меньше 128.
Строки Java концептуально кодируются как UTF-16. В UTF-16 набор символов ASCII кодируется как значения от 0 до 127, и кодировка любого символа, отличного от ASCII (который может состоять из более чем одного символа Java), гарантированно не включает числа от 0 до 127.
источник
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
поскольку первые 32 значения 7-битной кодировки являются управляющими символами, а конечное значение (0x7F) -DEL
.Или вы копируете код из IDN- класса.
источник
return false
вместоisASCII = false
иbreak
.commons-lang3 от Apache содержит ценные служебные / удобные методы для всех видов «проблем», включая этот.
источник
попробуй это:
источник
Выполните итерации по строке и используйте charAt () для получения символа. Затем относитесь к нему как к int и посмотрите, есть ли у него значение Unicode (надмножество ASCII), которое вам нравится.
Перерыв на первое, что вам не нравится.
источник
источник
charAt
возвращаетchar
. Можете ли вы напрямую проверить, является ли типchar
больше, чем int, сначала без преобразования в int, или ваш тест автоматически выполняет покрытие? Может быть, можно, а может быть? Я пошел вперед и превращал это к междунар так:if ((int)s.charAt(i) > 127)
. Не уверен, что мои результаты отличаются, но я чувствую себя лучше, если позволю ему поработать. Мы увидим: - \Это было возможно. Довольно проблема.
источник
Это вернет true, если String содержит только символы ASCII, и false, если это не так.
Если вы хотите удалить не ASCII, вот фрагмент:
источник
источник