Posted on Leave a comment

Android EditText InputFilter only ASCII symbols charset

In Java, is it possible to check if a String is only ASCII?

How do I use InputFilter to limit characters in an EditText in Android?

[code language=”java”]
try {
CharsetEncoder charsetEncoder = Charset.forName("cp1251").newEncoder();
input.setFilters(new InputFilter[]{new TemplateNameInputFilter(charsetEncoder)});
} catch (RuntimeException e) {
}

private static class TemplateNameInputFilter implements InputFilter {
private CharsetEncoder mCharsetEncoder;

public TemplateNameInputFilter(CharsetEncoder charsetEncoder) {
mCharsetEncoder = charsetEncoder;
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
StringBuilder sb = new StringBuilder();
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (mCharsetEncoder.canEncode(c))
sb.append(c);
}
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
[/code]

[code language=”java”]
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class StringUtils {

static CharsetEncoder asciiEncoder =
Charset.forName("US-ASCII").newEncoder(); // or "ISO-8859-1" for ISO Latin 1

public static boolean isPureAscii(String v) {
return asciiEncoder.canEncode(v);
}

public static void main (String args[])
throws Exception {

String test = "Réal";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
test = "Real";
System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));

/*
* output :
* Réal isPureAscii() : false
* Real isPureAscii() : true
*/
}
}
[/code]

[code language=”java”]
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[] { filter });
[/code]

[code language=”java”]
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {

if (source instanceof SpannableStringBuilder) {
SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
for (int i = end – 1; i >= start; i–) {
char currentChar = source.charAt(i);
if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) {
sourceAsSpannableBuilder.delete(i, i+1);
}
}
return source;
} else {
StringBuilder filteredStringBuilder = new StringBuilder();
for (int i = start; i < end; i++) {
char currentChar = source.charAt(i);
if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) {
filteredStringBuilder.append(currentChar);
}
}
return filteredStringBuilder.toString();
}
}
}
[/code]

[code language=”java”]
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end – start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}

private boolean isCharAllowed(char c) {
return Character.isLetterOrDigit(c) || Character.isSpaceChar(c);
}
}
editText.setFilters(new InputFilter[] { filter });
[/code]

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.