android - 我需要将 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();
}
}
}
解决方案
您可以简单地阻止用户输入除 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)
推荐阅读
- python - Dockerized web-service does not run in background even with detached flag
- sql-server-2008 - SQL: Select count and percentage with conditions
- ruby-on-rails - Update model field with button Rails
- java - 为二叉树创建路径 Arraylist 的 ArrayList?
- java - Spring security custom UserDetails not authenticating
- mysql - 带有用户/密码的 mysql --defaults-extra-file 产生“访问被拒绝...”
- amazon-web-services - What is exactly "Assume" a role in AWS?
- bash - 除法导致 '0' 在 bash 中,但分子和分母的值应该导致不同的结果
- python-3.x - Anaconda自带的python Vscode无法进入调试模式
- php - 如何在 datetime 字段中添加分钟,然后选择 mysql 中的所有匹配项?