C#根据字节数截取字符串【转载】
上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用Substring方法截取前6个字符就成了"a加b等于c"。产生这个问题的原因是将Substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。 要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:
然后从第一个字节开始扫描,对于一个英文或数字字符,UCS2编码的第一个字节是相应的ASCII,第二个字节是0,如a的UCS2编码是97 0,而汉字两个字节都不为0,因此,可以利于UCS2编码的这个规则来计算实际的字节数,为了更方便,将按字节长度截取字符串的方法注册为String类的扩展方法,实现代码如下:
{
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);
}
}
在上面的代码中,如果最后要截取奇数个字符(以字节为单位),并且当最后一个字符是字母或数字,则保留该字符,如果是汉字,说明这个汉字被截了一半,则去掉这个汉字。
可以使用下面的代码来截取字符串:
转载于:https://www.cnblogs.com/di305449473/archive/2008/11/18/1335629.html
C#根据字节数截取字符串【转载】相关推荐
- C#根据字节数截取字符串
/// <summary> /// 按最大字节数,截取字符串 /// </summary> /// <pa ...
- 解决在C#(.net)按字节数截取字符串最后出现乱码的问题
解决在C#(.net)按字节数截取字符串最后出现乱码的问题 参考文章: (1)解决在C#(.net)按字节数截取字符串最后出现乱码的问题 (2)https://www.cnblogs.com/xion ...
- Java按字节数截取字符串
最近在开发的过程中遇到的问题,接口要求传入参数在255个字节以内(GBK),但是入参是一个既有中文又有英文的字符串,所以需要按字节截取,翻了半天也没找到有现成的方法,于是选择了这样一种方法实现. /* ...
- vba 根据字节数截取字符串
vba 根据字节数截取字符串 ' str 要截取的字符串 ' byteLen 需要截取的字节长度 ' return byteLen长度的字符串 Public Function kiritoruStr( ...
- Java:根据字节数截取字符串,但是汉字不能截取半个。
截取字符串指定指定字节数的内容,如果指定的字节数在汉字的中间,汉字不能截取部分,只截取前面的内容. package com.lcx.test;import java.io.UnsupportedEnc ...
- iOS根据字节数截取字符串
最近项目有个需求,文章的作者最多显示7个中文字,英文字符算半个中文字,超过7个中文字,则显示:前7个中文字+...,使用NSString的length方法,不管是一个中文还是英文字符,都是返回1.因此 ...
- java 判断汉字是否截半,Java 按照字节来截取字符串的代码(不会出现半个汉字)
/* * Copyright 2012-2013 The Haohui Network Corporation */ package com.haohui.common.utils; /** * ...
- 自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串
题外话:做过大型网站前台的Web开发程序员最头疼的事情就是前台首页的布局,这其中最最头疼的就是标题字符的截取的问题,虽然有fn:substring,但表现率以及对中文的支持均不够完善,其实最终还是归结 ...
- java js 截取字符串_java和Js 按字节来截取字符串长度(为了符合数据库varchar)
/** * 截取符合oracle varchar长度的字符集 * * @author 陈兵 * */ public class SplitString { public static String s ...
最新文章
- AOP实践--利用MVC5 Filter实现登录状态判断
- 一次编译libmono.so的记录
- 干货 | 机器学习入门方法和资料合集
- php实现上传图片保存到数据库的方法
- [vue] 跟keep-alive有关的生命周期是哪些?描述下这些生命周期
- arcgis怎么用python重新排序_python - 根据排序数据添加新的顺序ID号(ArcGIS) - 堆栈内存溢出...
- 轨迹跟踪主要方法_带你入门多目标跟踪(一)领域概述
- c语言设计程序实现顺序冒泡_2019年9月全国计算机等级考试《二级C语言程序设计》题库...
- C语言学习笔记--数组参数和指针参数
- “strcmp”不能将参数从“LPWSTR”转换为“const char *”
- Android模拟器 使用 Fiddler抓包
- php实现短信验证功能
- 一个DDD指导下的实体类设计案例
- AutoLeaders控制组——C51单片机学习笔记--定时器串口通信LED点阵屏
- 北京市自动驾驶车辆测试概况
- Nature综述:农业生态系统中的土壤结构和微生物组功能
- easyPoi导出Excel,WPS可以打开,office却打不开的问题
- windows服务程序一
- AD中出现off grid pin问题的解决方法
- DockerCon 2016 西雅图即将到来,8大主题详尽解读
热门文章
- react 注释html,React之JSX语法
- rsa PHP用法,RSA常见用法整理
- python爬虫模拟点击下拉菜单和_python+selenium爬虫过程中的模拟点击问题
- 如何安装html启动器,如何在Spring Boot中创建自己的启动器?
- 以太坊2.0抵押地址新增13.47万ETH
- JDK 之 HttpClient(jdk11)
- 2 python全局变量如何指定(是在模块内,还是函数内)
- 金币(NOIP2015 普及组第一题)
- python,进程和线程
- stm32 r8025