AndroidのInputFillter之按字符过滤长度,一个中文当两个字符

/**
 * 以Byte数的方式来实现的LengthFilter
 * @author bvin
 */
public class OneByteInputFilter implements InputFilter{

    private final int mMax;

    public OneByteInputFilter(int mMax) {
        super();
        this.mMax = mMax;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
                    int dend) {
        //int remainLength = dest.length()-(dend-dstart);

        CharSequence placeStart = dest.subSequence(0, dstart);
        CharSequence placeEnd = dest.subSequence(dend, dest.length());

        int placeStartLength = Util.computeLenthByByte(placeStart.toString());
        int placeEndLength = Util.computeLenthByByte(placeEnd.toString());

        int canReplaceSize = mMax-placeStartLength-placeEndLength;

        if (canReplaceSize>0) {
            CharSequence sourceSpan = source.subSequence(start, end);
            int sourceSpanLength = Util.computeLenthByByte(sourceSpan.toString());
            if (sourceSpanLength>=canReplaceSize) {//替换内容长度大于可容纳长度
                String result = fixSplit(sourceSpan.toString(), canReplaceSize, false);
                if (!TextUtils.isEmpty(result)) {
                    return result;
                }else {
                    return "";
                }

            }else {
                return null;
            }

        }else {
            return "";
        }

    }

    private static String fixSplit(String s,int sum,boolean debug){
        int counter = 0;
        String fixString = null;
        for (int i = 0; i < s.length(); i++) {
            if (counter>=sum) {
                break;
            }
            int length = (s.charAt(i)+"").getBytes().length;
            if(length>1){
                counter += 2;
                if (counter<=sum) {
                    fixString = s.substring(0, i+1);
                }
            } else if (length==1){
                if (counter<=sum) {
                    fixString = s.substring(0, i+1);
                }
                ++counter;
            }else {//小于1
                continue;
            }

            /*if (counter>=sum) {
                System.out.println("break;"+counter);
                break;
            }else {
                fixString = s.substring(0, i+1);
            }*/
        }
        return fixString;
    }
}
时间: 2024-10-28 15:48:03

AndroidのInputFillter之按字符过滤长度,一个中文当两个字符的相关文章

判断字符串的长度,中文占两个字符

刚看到以前写的js方法:计算字符串长度(中文算2个字符). 方法: var str = '123是是是'; var strArr = str.split(''); var count = 0; for(strArr.length){ **** } ………………(不上代码了,累!!) 修改后: var str = '123是是是'; var tmpStr = str.replace(/[\u4e00-\u9fa5]/gi,"aa"); //print tmpStr.length

JS获取字符串长度,一个中文算两个字符。

//第一种 GetLength = function(str) { var realLength = 0; for (var i = 0; i < str.length; i++) { charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <= 128) realLength += 1; else realLength += 2; } return realLength; } //第二种(采取将255意外的

js判断输入字符串长度(汉字算两个字符,字母数字算一个):例如 要求输入12的字,24个字节

<html> <head> <title>js判断输入字符串长度(汉字算两个字符,字母数字算一个)</title> <style type="text/css"> .pbt { margin-bottom: 10px; } .ie6 .pbt .ftid a, .ie7 .pbt .ftid a { margin-top: 1px; } .cl:after { clear: both; content: ".&quo

Java语言中的字符char可以存储一个中文汉字吗为什么呢

Java语言中的字符char可以存储一个中文汉字吗?为什么呢? · 可以.因为Java语言采用的是Unicode编码.Unicode编码中的每个字符占用两个字节.Char储存的是一个字符(两个字节),中文也是占的两个字节 · 所以,Java中的字符可以存储一个中文汉字 原文地址:https://www.cnblogs.com/lcs-java/p/8486984.html

字符流中第一个不重复的字符-剑指Offer

字符流中第一个不重复的字符 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l". 输入描述 如果当前字符流没有存在出现一次的字符,返回#字符. 思路 模拟一个哈希表,长度为256,索引为字符的编码,初始化为-1,第一次出现时把该字符出现的位置赋给该数组元素,第二次出现时

求字符串长度带中文

//编写一个方法 求一个字符串的字节长度; //假设一个中文占两个字节 var str = 'A沪-5889588'; var json = {len:0}; var re = /[\u4e00-\u9fa5]/; //中文字符串正则 for (var i = 0; i < str.length; i++) { if (re.test(str.charAt(i))) { //判断当前字符是否为中文,为中文时加两个长度,不为中文时加一个长度 json['len'] = json['len'] +

54字符流中第一个不重复的字符

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l". 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符. 法1: 建立一个长度256的数组,当作字典 1 # -*- coding:utf-8 -*- 2 class Solution(): 3 #

字符流中第一个不重复的字符

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l". 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符. class Solution { public: //Insert one char from stringstream void Inser

52、字符流中第一个不重复的字符

一.题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l". 二.解法 1 mport java.util.ArrayList; 2 import java.util.HashMap; 3 public class Solution { 4 HashMap<Ch