Android EditText 文本长度限制(按照一个汉字占俩长度 类似字节)

Android EditText 文本长度限制有很简单的一种限制方式:在xml布局文件中对EditText添加 Android:maxLength="N"

但是这种简单的方式可能有时候不能满足某些比较较真的需求,这个时候就需要用别的的方式去限制长度了。

也就是通过InputFilter来实现:

private class NameLengthFilter implements InputFilter {
        int MAX_EN;
        String regEx = "[\\u4e00-\\u9fa5]";

        public NameLengthFilter(int mAX_EN) {
            super();
            MAX_EN = mAX_EN;
        }

        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                                   Spanned dest, int dstart, int dend) {
            int destCount = dest.toString().length()
                    + getChineseCount(dest.toString());
            int sourceCount = source.toString().length()
                    + getChineseCount(source.toString());
            if (destCount + sourceCount > MAX_EN) {
                int surplusCount = MAX_EN - destCount;
                String result = "";
                int index = 0;
                while (surplusCount > 0) {
                    char c = source.charAt(index);
                    if (isChinest(c + "")) {
                        if (sourceCount >= 2) {
                            result += c;
                        }
                        surplusCount = surplusCount - 2;
                    } else {
                        result += c;
                        surplusCount = surplusCount - 1;
                    }
                    index++;
                }
                return result;
            } else {
                return source;
            }
        }

        private int getChineseCount(String str) {
            int count = 0;
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(str);
            while (m.find()) {
                for (int i = 0; i <= m.groupCount(); i++) {
                    count = count + 1;
                }
            }
            return count;
        }

        private boolean isChinest(String source) {
            return Pattern.matches(regEx, source);
        }
    }

以上是自定义的Filter,给需要的EditText设置就OK了:

ed_nane.setFilters(filters);

可能某些代码比较low,但是可以用。

时间: 2024-10-12 11:32:27

Android EditText 文本长度限制(按照一个汉字占俩长度 类似字节)的相关文章

mysql和oracle的一个汉字占几个字符

以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char_length计算的是字符长度,而length计算的是字节长度,刚好我使用的是utf8,一个汉字占3个字节,占一个字符. 那好了,应该是对的上了,可是好奇心我就试了下 为什么这是相同的?因为这不是汉字 好了,现在知道原来mysql和oracle一样的,但是又看到一篇说mysql的varchar与or

java梳理-一个汉字占多大空间

面试题:一个汉字占多大空间. 事实上这个问题我了解不深的,知道结论不知道为什么.借此梳理下认识. 先回想下java基本类型 一基本类型 :简称四类八种,声明变量的同一时候分配了空间.举比例如以下: Int a =1;一.4种整型     byte      1字节           -128--127     short     2 字节         -32,768 -- 32,767     int       4 字节          -2,147,483,648 --2,147,4

Java一个汉字占几个字节(详解与原理)(转载)

1.先说重点: 不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,可能是2个.3个.4个字节: 2.以下是源码: 1 @Test 2 public void test1() throws UnsupportedEncodingException { 3 String a = "名"; 4 System.out.println("UTF-8编码长度:"+a.getBytes("UTF-8").length); 5 Sys

在UTF-8中,一个汉字为什么需要三个字节?

原文:https://www.cnblogs.com/web21/p/6092414.html UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicode为什么会出现就不叙述了,Unicode是针对所有计算机的使用者定义一套统一的编码规范,这样计算机使用者就避免了编码转换的问题. Unicode定义了所有符号的二进制形式,也就是符号如何在计算机内部存储的,而且每个符号规定都必须使用两个字节来表示,也就是用16位二进制去代表一个符号,这样就导

一个汉字在数据库占几个字节

项目中oracle10g数据库表字段为varchar(n)类型,存英文很简单,只要字母个数不大于n即可.但是对于汉字,按照同样的方法就不行了.因为对于汉字不同的字符集,在数据库占用的字节是不一样的.UTF-8字符集,一个汉字占三个字节,gbk字符集,一个汉字占两个字节,比如varchar(10)类型的字段,UTF-8的汉字,只能存3个,gbk字符集的汉字却能存5个.所以在程序中根据表字段varchar的大小,保存或更新时作出必要的校验否则后台会报错.办法:1.用表格 maxlength属性,比如

系统存储之:一个汉字在数据库占几个字节

参考文献:http://csumissu.iteye.com/blog/1090053 UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码.UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强.UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示.如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们

mysql5.1中utf8编码下一个汉字占用一个char的疑惑

最近发现Oracle和MySQL的字段长度的计算不一样(都是UTF8编码),比如: 在Oracle下定义:name varchar2(10) ,name字段能存放:10个字符或3个汉字 在MySQL下定义:name varchar(10),name字段能存放:10个字符或10个汉字 从上面可以得知:在oracle下,1个汉字=3个字节 为什么在 MySQL 下,1个汉字=1个字节 呢?? 经查,说:MySQL5 以后 varchar 的单位是字符了,而 oracle 的varchar2 是字节

python中一个汉字点3个字节? utf-8

今天发现了一个汉字占了3个字节,一开始以为是两个呢,字符串切片时总出现乱码,后来才发现一个中文占3个字节.这才解决了乱码问题 原来  1. utf-8 编码中,一个汉字占三个字节.英文字母是一个占用一个字节. 参考链接:https://blog.csdn.net/cadi2011/article/details/82048702 我发现python里面,汉子的长度,一个是占3个 1.难道是因为 utf-8的话一个汉子是占用了3个字节 2.反正今天顺着一个bug,想看看字符串的长度,结果一串英文,

android EditText监听和长度监测事件

<?xml version="1.0" encoding="utf-8"?> <!-- 定义基础的LinearLayout布局 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height=&q