Web应用程序在浏览器中显示字符串时,由于显示长度的限制,常常需要将字符串截取后再进行显示。但目前很多流行的语言,如C#、Java内部采用的都是Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:

String s = "a加b等于c,如果a等1、b等于2,那么c等3"; 

上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用Substring方法截取前6个字符就成了"a加b等于c"。产生这个问题的原因是将Substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。 要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:

byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);

然后从第一个字节开始扫描,对于一个英文或数字字符,UCS2编码的第一个字节是相应的ASCII,第二个字节是0,如a的UCS2编码是97  0,而汉字两个字节都不为0,因此,可以利于UCS2编码的这个规则来计算实际的字节数,为了更方便,将按字节长度截取字符串的方法注册为String类的扩展方法,实现代码如下:

public static class StringExt
{
    public static String bSubstring(this string s, int length)
    {
        byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
        int n = 0;  //  表示当前的字节数
        int i = 0;  //  要截取的字节数
        for (; i < bytes.GetLength(0) && n < length; i++)

{

//  偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节

if (i % 2 == 0)
            {
                n++;      //  在UCS2第一个字节时n加1
            }
            else

{

//  当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节

if (bytes[i] > 0)
                {
                    n++;
                }
            }

}

//  如果i为奇数时,处理成偶数

if (i % 2 == 1)

{

//  该UCS2字符是汉字时,去掉这个截一半的汉字

if (bytes[i] > 0)

i = i - 1;

//  该UCS2字符是字母或数字,则保留该字符

else
                i = i + 1;
        }
        return System.Text.Encoding.Unicode.GetString(bytes, 0, i);
    }
}

在上面的代码中,如果最后要截取奇数个字符(以字节为单位),并且当最后一个字符是字母或数字,则保留该字符,如果是汉字,说明这个汉字被截了一半,则去掉这个汉字。

可以使用下面的代码来截取字符串:

String subStr = s.bSubstring(6);  //  substr的值是"a加b等"

转载于:https://www.cnblogs.com/di305449473/archive/2008/11/18/1335629.html

C#根据字节数截取字符串【转载】相关推荐

  1. C#根据字节数截取字符串

            /// <summary>         /// 按最大字节数,截取字符串         /// </summary>         /// <pa ...

  2. 解决在C#(.net)按字节数截取字符串最后出现乱码的问题

    解决在C#(.net)按字节数截取字符串最后出现乱码的问题 参考文章: (1)解决在C#(.net)按字节数截取字符串最后出现乱码的问题 (2)https://www.cnblogs.com/xion ...

  3. Java按字节数截取字符串

    最近在开发的过程中遇到的问题,接口要求传入参数在255个字节以内(GBK),但是入参是一个既有中文又有英文的字符串,所以需要按字节截取,翻了半天也没找到有现成的方法,于是选择了这样一种方法实现. /* ...

  4. vba 根据字节数截取字符串

    vba 根据字节数截取字符串 ' str 要截取的字符串 ' byteLen 需要截取的字节长度 ' return byteLen长度的字符串 Public Function kiritoruStr( ...

  5. Java:根据字节数截取字符串,但是汉字不能截取半个。

    截取字符串指定指定字节数的内容,如果指定的字节数在汉字的中间,汉字不能截取部分,只截取前面的内容. package com.lcx.test;import java.io.UnsupportedEnc ...

  6. iOS根据字节数截取字符串

    最近项目有个需求,文章的作者最多显示7个中文字,英文字符算半个中文字,超过7个中文字,则显示:前7个中文字+...,使用NSString的length方法,不管是一个中文还是英文字符,都是返回1.因此 ...

  7. java 判断汉字是否截半,Java 按照字节来截取字符串的代码(不会出现半个汉字)

    /* *    Copyright 2012-2013 The Haohui Network Corporation */ package com.haohui.common.utils; /** * ...

  8. 自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串

    题外话:做过大型网站前台的Web开发程序员最头疼的事情就是前台首页的布局,这其中最最头疼的就是标题字符的截取的问题,虽然有fn:substring,但表现率以及对中文的支持均不够完善,其实最终还是归结 ...

  9. java js 截取字符串_java和Js 按字节来截取字符串长度(为了符合数据库varchar)

    /** * 截取符合oracle varchar长度的字符集 * * @author 陈兵 * */ public class SplitString { public static String s ...

最新文章

  1. AOP实践--利用MVC5 Filter实现登录状态判断
  2. 一次编译libmono.so的记录
  3. 干货 | 机器学习入门方法和资料合集
  4. php实现上传图片保存到数据库的方法
  5. [vue] 跟keep-alive有关的生命周期是哪些?描述下这些生命周期
  6. arcgis怎么用python重新排序_python - 根据排序数据添加新的顺序ID号(ArcGIS) - 堆栈内存溢出...
  7. 轨迹跟踪主要方法_带你入门多目标跟踪(一)领域概述
  8. c语言设计程序实现顺序冒泡_2019年9月全国计算机等级考试《二级C语言程序设计》题库...
  9. C语言学习笔记--数组参数和指针参数
  10. “strcmp”不能将参数从“LPWSTR”转换为“const char *”
  11. Android模拟器 使用 Fiddler抓包
  12. php实现短信验证功能
  13. 一个DDD指导下的实体类设计案例
  14. AutoLeaders控制组——C51单片机学习笔记--定时器串口通信LED点阵屏
  15. 北京市自动驾驶车辆测试概况
  16. Nature综述:农业生态系统中的土壤结构和微生物组功能
  17. easyPoi导出Excel,WPS可以打开,office却打不开的问题
  18. windows服务程序一
  19. AD中出现off grid pin问题的解决方法
  20. DockerCon 2016 西雅图即将到来,8大主题详尽解读

热门文章

  1. react 注释html,React之JSX语法
  2. rsa PHP用法,RSA常见用法整理
  3. python爬虫模拟点击下拉菜单和_python+selenium爬虫过程中的模拟点击问题
  4. 如何安装html启动器,如何在Spring Boot中创建自己的启动器?
  5. 以太坊2.0抵押地址新增13.47万ETH
  6. JDK 之 HttpClient(jdk11)
  7. 2 python全局变量如何指定(是在模块内,还是函数内)
  8. 金币(NOIP2015 普及组第一题)
  9. python,进程和线程
  10. stm32 r8025