Android文件管理器修改文件名出错

    xiaoxiao2026-09-21  12

    CMFileManager中修改文件名,当字符数达到最大值时,全英文是可以修改成功的,但是如果如果删掉两个英文字符,写上一个中文,此时并没有到达最大值,但是保存时依然出错。 虽然EditText中写了最大字符数是255,但是还是出错,经过排查原因是android文件系统限制了文件名的最大长度是255,但是这个长度不是字符串的长度,而是字符串byte的长度。上述例子出错的原因是:android默认模式下是用UTF-8,中文占三个字节,所有删两个英文字符写一个中文还是会超过限制。 解决方法:在EditText中添加监听,不是仅仅显示最大字符数,而应该限制输入字符串的字节数。 下面是参考了别人的例子,并稍作修改,如下:

    private TextWatcher textWatcher = new TextWatcher() { private int editStart; private int editEnd; private int maxLen = 10; // the max byte @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.d("TextChanged", "---->beforeTextChanged : start = " + start + " count = " + count + " after = " + after); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { editStart = opinion.getSelectionStart(); editEnd = opinion.getSelectionEnd(); // 先去掉监听器,否则会出现栈溢出 opinion.removeTextChangedListener(textWatcher); if (!TextUtils.isEmpty(opinion.getText())) { String etstring = opinion.getText().toString().trim(); //这里不用他们的,过于死板,直接改成byte的长度来判断,这样就不分语言,不分编码格式了。 // while (calculateLength(s.toString()) > maxLen) { while (s.toString().getBytes().length > maxLen) { s.delete(editStart - 1, editEnd); editStart--; editEnd--; Log.d("TextChanged", "editStart = " + editStart + " editEnd = " + editEnd); } } opinion.setText(s); opinion.setSelection(editStart); // 恢复监听器 opinion.addTextChangedListener(textWatcher); // end by zyf -------------------------- } private int calculateLength(String etstring) { char[] ch = etstring.toCharArray(); int varlength = 0; for (int i = 0; i < ch.length; i++) { // changed by zyf 0825 , bug 6918,加入中文标点范围 , TODO 标点范围有待具体化 if ((ch[i] >= 0x2E80 && ch[i] <= 0xFE4F) || (ch[i] >= 0xA13F && ch[i] <= 0xAA40) || ch[i] >= 0x80) { // 中文字符范围0x4e00 0x9fbb varlength = varlength + 2; } else { varlength++; } } Log.d("TextChanged", "varlength = " + varlength); // 这里也可以使用getBytes,更准确嘛 // varlength = etstring.getBytes(CharSet.forName("GBK")).lenght;// 编码根据自己的需求,注意u8中文占3个字节... return varlength; } };

    参考地址:http://www.tuicool.com/articles/EB36Jv

    转载请注明原文地址: https://ju.6miu.com/read-1312164.html
    最新回复(0)