Android字数限制的EditText实现方案研究

日期: 2019-12-06 15:16 浏览次数 :

例如说微博新浪发博客园的输入框有三个已输入字数的总计,它的法则估算是:汉字和汉语标点算 1 个字数,西班牙语和其余标识算 0.5 个字数。不足 1 个字算 1 个。大家能够去天涯论坛体验一下计量方法。

关于C++普通话字符的管理

图片 1

在利用开辟中,一时须求得以达成有字数节制的EditText,首先来深入分析下市情上存在的近乎完结方案吗,好有个感性的认知。

很准确的稿子,方今栽在此上面了,转来收藏下,改正了有的小标题。
第风流浪漫钻探本身的难题,对于非宽字符的字符串string,假设有汉字,那么怎么样获得汉字字符呢?直接用索引的话只可以获得单字节,因而须求管理下,方法如下:
wchar_t word = *(wchar_t*)(&(mystring[j]));

golang 能够行使正则和 unicode 包的措施剖断。

【方案大器晚成:Tencent搜狐】

对此string对象,要出口此中有些汉字,能够这样
string word(mystring,pos,pos+1卡塔尔(قطر‎;//pos为有个别汉字的撼动地点,由于汉字占八个字节,由此将mystring的七个字节拷贝到word中就能够输出汉语字符了。
然后cout<<word; 即可。
此外对于宽字符的单个汉字字符是不能输出的,唯有将其调换来字符串才行。
    wcout.imbue(locale("chs"));
    wcout<<L"汉"; 能够出口"汉"字
wcout<<L'汉'; 无法输出汉,输出的只是编码

以下函数 GetStrLength 重返输入的字符串的字数,种种汉字和中文标点算 1 个字数,斯洛伐克共和国语和其它字符算半个字数,不足 1 个字算 1 个。

各在那之中文字符算三个篇幅,每五个韩文字符算贰个篇幅,当顾客输入内容时,实时展现剩余的字数,当不仅仅字数限定时,剩余字数字展现示为负数,但当时顾客如故能够持续在艾德itText中输入内容,直到客商点击菜单中的“发送”开关时,才会弹出对话框大概Toast显示客户输入的篇幅超过标准,如下图所示:

以下为转载内容:
一 引进难点

// GetStrLength 返回输入的字符串的字数,汉字和中文标点算 1 个字数,英文和其他字符 2 个算 1 个字数,不足 1 个算 1个
func GetStrLength(str string) float64 {
 var total float64
 reg := regexp.MustCompile("/·|,|。|《|》|‘|'|”|“|;|:|【|】|?|(|)|、/") 
 for _, r := range str {
 if unicode.Is(unicode.Scripts["Han"], r) || reg.Match([]byte(string(r))) {
 total = total + 1
 } else {
 total = total + 0.5
 }
 } 
 return math.Ceil(total)
}

图片 2 图片 3

代码 wchar_t a[3]=”中华夏族民共和国”,编写翻译时出错

1:获取字符串字节的个数,并按字节挨个出口

这一个方案完毕起来很简短,只须要给EditText设置TextWatcher监听器,然后剖断输入的是中文字符依旧越南语字符,实时更新剩余输入字数字展现示就可以,无需节制艾德itText的输入。

二 解决引进难点所需的文化

package main

import (
  "fmt"
)

func main() {
  var str string = "abc郑闯" //共9个字节
  charray := []byte(str)  //转换为byte:一个字节对应一个数组元素
  fmt.Println(len(charray)) //获取元素的个数,结果为9
  for _, v := range charray {
    fmt.Printf("%c", v) //输出结果为:abcéé¯
  }
}

【方案二:百度畅游】

   首要需两地点的学问,第二个为字符特别是汉字的编码,以至语言和工具的支撑情状,第三个是vc/c++中MutiByte Charater Set 和 Wide Character Set有关内部存款和储蓄器分配的情状.

输出:

中斯洛伐克共和国语字符都算叁个篇幅,当客户输入内容时,实时呈现剩余的字数,当不仅字数约束时,剩余字数字展现示为0,不会不由自主负数的意况,这个时候EditText再也不抽出客商输入的任何内容了。

三 汉字的编码格局及在vc/c++中的管理

9
abcéé¯

图片 4

1.汉字编码方式的牵线

2:获取字符串成分的个数,并按要素挨个出口

其一方案由于中德文都占二个篇幅,由此能够一向给EditText设置InputFilter.LengthFilter,此时LengthFilter会自动帮艾德itText限定客商输入的从头到尾的经过;再给EditText设置TextWatcher监听器,就足以实时更新剩余字数了。

对英文字符的拍卖,7位ASCII码字符集中的字符就能够知足使用供给,且意大利共和国语字符在Computer上的输入及出口也特别轻易,由此,Slovak语字符的输入、存款和储蓄、内部管理和输出都能够只用同二个编码(如ASCII码)。

package main
import (
  "fmt"
)

func main() {
  a := "I love my family!我爱我的家人!"
  b := []rune(a)   //转换为rune:一个字符对应一个元素 (共24个)
  fmt.Println(len(b)) //获取元素的个数(24)
  for _, v2 := range b {
    fmt.Printf("%c", v2) //输出结果:I love my family!我爱我的家人!
  }
}

本文综合上边四个方案,给出【方案三】,每一个粤语字符算叁个篇幅,每五个法语字符算二个篇幅,当客户输入内容时,实时展现剩余的篇幅,当不仅字数限定期,剩余字数字显示示为0,不会并发负数的气象,那个时候EditText再也不选取客商输入的别的内容了。

而 汉字是意气风发种象形文字,字数极多(今世汉字中仅常用字就有六、八千个,总篇幅高达5万个以上),且字形复杂,每多少个汉字都有"音、形、义"三要素,同音字、 异体字也比非常多,这个都给汉字的的计算机管理带给了异常的大的勤奋。要在微处理机中管理汉字,必需清除以下多少个难点:首先是汉字的输入,即怎么样把布局复杂的方块汉 字输入到Computer中去,那是汉字管理的关键;其次,汉字在微机内怎么表示和仓库储存?怎么样与西方文字兼容?最后,如何将汉字的管理结果从计算机内输出?

输出:

方案三可用以app须要集成第三方sns共享成效,且必得和睦完结分享分界面包车型客车意况。由于中意大利语所占的字数不周围,就无法接收LengthFilter来界定顾客再EditText中输入内容(因为在顾客达成内容输入以前,是不亮堂要给lengthFilter设置的最大值的)。由此必须要在TextWatcher中做些小动作了。方案三分界面如下:

为此,必需将汉字代码化,即对汉字进行编码。对应于上述汉字管理进程中的输入、内处及出口这三个重大环节,每一个中国字的编码都不外乎输入码、沟通码、内部码和字形码。在Computer的汉字音讯管理系统中,管理汉字时要实行如下的代码转变:输入码→沟通码→内部码→字形码。

24
I love my family!小编爱小编的骨血!

图片 5 图片 6

(1卡塔尔国输入码: 成效是,利用它和水保的正规西方文字键盘结合来输入汉字。输入码也称之为外码。首要归为四类:

上述正是本文的全部内容,希望对大家的学习抱有助于,也冀望我们多多指教脚本之家。

全部职能的主干实现都在EditText的TextWatcher监听器里面包车型地铁afterTextChanged回调函数中。代码如下所示:

a卡塔尔(英语:State of Qatar)      数字编码:数字编码是用等长的数字串为汉字逐个编号,以那一个号码作为汉字的输入码。比如,区位码、电报码等都归属数字编码。

您可能感兴趣的篇章:

  • Golang汉语字符串截取函数完毕原理
  • Golang完毕字符串倒序的二种减轻方案
  • Golang字符串变位词示例精解
  • 精解Golang 与python中的字符串反转
  • mongodb 数据类型(null/字符串/数字/日期/内嵌文书档案/数组等卡塔尔国
  • mongodb管理普通话索引与追寻字符串详明
  • Golang使用zlib压缩和平解决压缩字符串
  • Golang编制程序达成删除字符串中现身次数最少字符的不二等秘书诀
  • Go语言完结字符串切成丝赋值的法子小结
  1. package com.hust.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.text.Editable;  
  6. import android.text.TextWatcher;  
  7. import android.widget.EditText;  
  8. import android.widget.TextView;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     private EditText mEditText = null;  
  13.     private TextView mTextView = null;  
  14.   
  15.     private static final int MAX_COUNT = 140;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.         mEditText = (EditText) findViewById(R.id.content);  
  22.         mEditText.addTextChangedListener(mTextWatcher);  
  23.         mEditText.setSelection(mEditText.length(卡塔尔国卡塔尔; // 将光标移动最后二个字符前面  
  24.           
  25.         mTextView = (TextView) findViewById(R.id.count);  
  26.         setLeftCount();  
  27.     }  
  28.   
  29.     private TextWatcher mTextWatcher = new TextWatcher() {  
  30.   
  31.         private int editStart;  
  32.   
  33.         private int editEnd;  
  34.   
  35.         public void afterTextChanged(Editable s) {  
  36.             editStart = mEditText.getSelectionStart();  
  37.             editEnd = mEditText.getSelectionEnd();  
  38.   
  39.             // 先去掉监听器,否则会并发栈溢出  
  40.             mEditText.removeTextChangedListener(mTextWatcher);  
  41.   
  42.             // 注意这里只可以每一趟都对全部EditText的内容求长度,不可能对删除的单个字符求长度  
  43.             // 因为是中Republic of Croatia语混合,单个字符来讲,calculateLength函数都会重临1  
  44.             while (calculateLength(s.toString()) > MAX_COUNT卡塔尔(英语:State of Qatar) { // 当输入字符个数超过限定的高低时,进行截断操作  
  45.                 s.delete(editStart - 1, editEnd);  
  46.                 editStart--;  
  47.                 editEnd--;  
  48.             }  
  49.             // mEditText.setText(s卡塔尔国;将那行代码注释掉就不会现出后边所说的输入法在数字分界面自动跳转回主分界面包车型客车标题了,多谢@ainiyidiandian的提示  
  50.             mEditText.setSelection(editStart);  
  51.   
  52.             // 苏醒监听器  
  53.             mEditText.addTextChangedListener(mTextWatcher);  
  54.   
  55.             setLeftCount();  
  56.         }  
  57.   
  58.         public void beforeTextChanged(CharSequence s, int start, int count,  
  59.                 int after) {  
  60.   
  61.         }  
  62.   
  63.         public void onTextChanged(CharSequence s, int start, int before,  
  64.                 int count) {  
  65.   
  66.         }  
  67.   
  68.     };  
  69.   
  70.     /** 
  71.      * 总结分享内容的字数,二个汉字=多少个丹麦语字母,多少个汉语标点=七个德文标点 注意:该函数的不适用于对单个字符实行计算,因为单个字符四舍五入后都是1 
  72.      *  
  73.      * @param c 
  74.      * @return 
  75.      */  
  76.     private long calculateLength(CharSequence c) {  
  77.         double len = 0;  
  78.         for (int i = 0; i < c.length(); i++) {  
  79.             int tmp = (int) c.charAt(i);  
  80.             if (tmp > 0 && tmp < 127) {  
  81.                 len += 0.5;  
  82.             } else {  
  83.                 len++;  
  84.             }  
  85.         }  
  86.         return Math.round(len);  
  87.     }  
  88.   
  89.     /** 
  90.      * 刷兴安盟下输入字数,最大值博客园今日头条是1三十三个字,人人网是200个字 
  91.      */  
  92.     private void setLeftCount() {  
  93.         mTextView.setText(String.valueOf((MAX_COUNT - getInputCount())));  
  94.     }  
  95.   
  96.     /** 
  97.      * 获取顾客输入的享用内容字数 
  98.      *  
  99.      * @return 
  100.      */  
  101.     private long getInputCount() {  
  102.         return calculateLength(mEditText.getText().toString());  
  103.     }  
  104.   
  105. }  

b卡塔尔(英语:State of Qatar)      拼音码:拼音码是以汉字的读音为根底的输入办法。

但是上边代码存在一个bug,给EditText设置TextWatcher之后,由于afterTextChanged的代码实现会促成输入法分界面刷新,从而使得每回输入字符,输入法界面都会跳转到他的主界面去,

c卡塔尔(قطر‎      字形码:字形码是以汉字的字形构造为根基的输入编码。比如,五笔字型码(王码)。

诸如我们当大家要输入数字时,首先要转到数字输入分界面,平常状态下得以源源不断输入四个数字,数字输入实现后,界面依旧维持在数字输入分界面,输入数字1前后界面临比图(不奇怪情形):

d卡塔尔(قطر‎      音形码:音形码是全职汉字的读音和字形的输入编码。

图片 7 图片 8

(2卡塔尔交流码:用于汉字外码和内部码的交流。交流码的国标代号为GB2312-80。

而给EditText设置大家定义的Textwatcher监听器之后,在数字输入分界面,每输入三个数字,输入法都会跳回主界面,须求客商再点击技巧回去数字输入分界面,如下图所示(引进的bug),也是输入数字1前后分界面前碰到比图:

(3卡塔尔内部码:内部码是汉字在微微型机内的骨干代表情势,是Computer对汉字举行甄别、存储、管理和传导所用的编码。内部码也是双字节编码,将国家标准码八个字节的最高位都置为"1",即转变到汉字的内部码。

图片 9 图片 10

(4卡塔尔字形码:字形码是象征汉字字形音信(汉字的布局、形状、笔划等)的编码,用来促成计算机对汉字的输出(彰显、打印)。

假若有哪位知道怎么化解的,招待在说东道西中予以建议。

2.VC中汉字的编码形式

附:上边代码中对Editable作操作前,必需先将自己的监听器去使能,不然会挑起EditText自己的死循环,进而变成货仓溢出,将函数afterTextChanged中去掉监听器和增加监听器两行代码注释掉,再一次运路程序,在输入内容超过字数节制时,如下代码将被实施到:

     vc/c++正是采用了GB2312内部码作为汉字的编码情势,由此vc/c++中的各类输入输出方法,如cin/wcin,cout/wcout,scanf /wsanf,printf/wprintf...都以基于GB2312的,若是汉字的内码不是这种编码格局,那么利用上述各个措施就不会精确的拆解解析汉 字。

  1. while (calculateLength(s.toString()) > MAX_COUNT卡塔尔(قطر‎ { // 当输入字符个数超越节制的尺寸时,举办截断操作  
  2.     s.delete(editStart - 1, editEnd);  
  3.     editStart--;  
  4.     editEnd--;  
  5. }  

留心观望ASCII字符表,从第164个字符在那从前,前面的字符并不平时为顾客所接收,负值也未使用。GB2312编码方式丰硕利用这一特色,将 161-255(-95~-1)之间的数值空间作为汉字的标志码。既然255-161 = 94不能够满足汉字体积的需要,就将每八个字符并在一块(即三个中黄炎子孙民共和国字占五个字节卡塔尔国,鲜明,94* 94 =8836大约已经满意了常用汉字个数的渴求。Computer管理字符时,当再而三管理到多少个大与160(或-95~-1卡塔尔(قطر‎的字节时,就觉着这多个字节贮存了一个汉字字符。能够用下边包车型大巴德姆o程序来效仿vc/c++中输出汉字字符的进度。

此刻德姆o现身Crash,极度消息如下:

    unsigned char input[50];

图片 11

cin>>input;

 

    int flag=0;

德姆o源码参见:

     for(int i =0 ;i < 50 ;i++)

分享到:

      {

         if(input[i] > 0xa0 && input[i] != 0)