过滤3个字节以上的utf-8字符

public static String filterOffUtf8Mb4_2(String text) throws UnsupportedEncodingException {
        byte[] bytes = text.getBytes("utf-8");
        ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
        int i = 0;
        while (i < bytes.length) {
            short b = bytes[i];
            if (b > 0) {
                buffer.put(bytes[i++]);
                continue;
            }

            b += 256; // 去掉符号位

            if (((b >> 5) ^ 0b110) == 0) {
                buffer.put(bytes, i, 2);
                i += 2;
                System.out.println("2");
            } else if (((b >> 4) ^ 0b1110) == 0) {
                System.out.println("3");
                buffer.put(bytes, i, 3);
                i += 3;
            } else if (((b >> 3) ^ 0b11110) == 0) {
                i += 4;
                System.out.println("4");
            } else if (((b >> 2) ^ 0b111110) == 0) {
                i += 5;
                System.out.println("5");
            } else if (((b >> 1) ^ 0b1111110) == 0) {
                i += 6;
                System.out.println("6");
            } else {
                buffer.put(bytes[i++]);
            }
        }
        buffer.flip();
        return new String(buffer.array(), "utf-8");
    }
时间: 2024-10-16 02:33:27

过滤3个字节以上的utf-8字符的相关文章

《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 &amp;&amp; 检查一个字符串是文本还是二进制

过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: import string allchars = string.maketrans('','') #all chars table def makefilter(keep): delchars = allchars.translate(allchars,keep) def thefilter(s): retu

字节数组与字符串(字符数组)的转换操作

1.默认编码方式转换: (1)string(char[])转换为byte[] byte[] byteArr = System.Text.Encoding.Default.GetBytes(char[]); byte[] byteArr = System.Text.Encoding.Default.GetBytes(string); byte[] byteArr = System.Text.Encoding.Default.GetBytes(char[], startindex, count);

关于字符串的字节长度,不是字符长度。

string s = "张"; var ss = System.Text.Encoding.UTF8.GetBytes(s).Length;//UTF8编码格式 中文三个字节.英文字母或者数字或者特殊字符 占1个字节(全角输入法 占三个字节) var ss1 = System.Text.Encoding.UTF8.GetByteCount(s); var ss2 = System.Text.Encoding.GetEncoding("GB2312").GetByte

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 sou

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对

微信表情过滤 java &quot;java.sql.SQLException: Incorrect string value: &#39;\&quot;

iOS 5.0之前,苹果都是采用3个字节来承接emoji表情,Java的普通char可以支持显示.但iOS 5.0之后, 苹果升级了系统自带的emoji表情输入法,用的Unicode 6标准来统一,是采用4个bytes来承接一个 emoji表情.如果不做处理的话,这种表情直接存储到mysql5.5以下的数据库是会报错的. 就像这两个表情一样:, 在Windows 8以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在Mac中使用Safari浏览器中,就可以看到.经过测试,在Mac

[转]Filter实现处理中文乱码,转义html标签,过滤敏感词

原文地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

从字节理解Unicode(UTF8/UTF16)

如果你不知道或者不了解什么是Unicode/UTF8/UTF16,请详细阅读这篇文章(这也是这篇博文的先决条件): 学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 但是如果你看完以上文章后,疑惑为什么一个Unicode:0x4F60(对应汉字是"你")会在UTF8下占用3个字节的存储空间. 按照排列组合2个字节完全可以存储多数unicode字符,明显字符"你"(0x4F60)是在2个字节最大可能范围内(0xFFFF). 但是为什么UTF8却使用3个字节

Unicode 与 UTF 字符标准

Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示.        Unicode用两个字节表示一个字符.前127个字符与ASCII标准一样,前256个字符符合ISO 8859-1标准.                UTF (UCS Transformation Format)提供的 Unicode 字符的表示法对文件系统都是安全的.UTF-8 使用一个字节表示常用的7位ASCII字符,用两个字节表示8位ASCII字符