首页 > 解决方案 > 我需要将 Android textInput 限制为仅 ISO-8859-1 字符

问题描述

我在我的 android 应用程序上有一个输入,来自这个输入的文本被发送到我的服务器,然后由另一个前端检索以显示。另一个前端只能使用 ISO-8859-1 字符集,如果遇到任何其他字符(它是一个旧软件)就会崩溃,所以我需要限制 EditText 只允许 ISO-8859-1 字符,我是不知道我怎么能做到这一点。

[编辑]
非常感谢 aarnaut 的帮助,这就是我最终得到的结果:

public class ISO_8859_1_InputFilter implements InputFilter {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        CharsetEncoder iso_8859_1 = Charset.forName("ISO_8859_1").newEncoder();
        if (source instanceof SpannableStringBuilder) {
            SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder) source;
            for (int i = end - 1; i >= start; i--) {
                char currentChar = source.charAt(i);
                if (!iso_8859_1.canEncode(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 (iso_8859_1.canEncode(currentChar)) {
                    filteredStringBuilder.append(currentChar);
                }
            }
            return filteredStringBuilder.toString();
        }
    }
}

标签: android

解决方案


您可以简单地阻止用户输入除 ISO-8859-1 允许的内容之外的任何内容。您可以通过将android:digits属性应用于 EditText 来做到这一点,例如

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "

或者通过在将新字符传递到视图时实现自定义过滤器。这将确保您只有 ISO-8859-1 字符。

java.nio.charset 包中的一个类CharsetEncoder提供了检查字符串/字符是否满足特定编码的可能性,

val encoder = Charset.forName("ISO_8859_1").newEncoder()
val canEncode = encoder.canEncode(text)

推荐阅读