C#中如何按字节数截取字符串占用字节数

博客分类:
* 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
* 但是要保证汉字不被截半个,如"我ABC"4,应该截为“我AB”,输入“我ABC汉DEF”,6,
* 应该输出为“我ABC”而不是"我ABC+汉的半个"。
* 此处的编码方式应该是操作系统默认的GB编码,即汉字占2个字节且第一个字节的最高位是1,
* 如果理解为有符号数的话,就是负数;而英文占1个字节,符合ASC2码。
public class SplitString {
private int byteN
public SplitString(String str,int byteNum){
this.str =
this.byteNum = byteN
public String splitIt(){
String targetString =
byte[] bt = this.str.getBytes();
System.out.println("Length of this string is :" + bt.length);
if(bt[byteNum] & 0){
targetString = new String(bt,0,--byteNum);
targetString = new String(bt,0,byteNum);
return targetS
public class TestSplitString {
public static void main(String[] arg){
String oldString = "我ABC汉D";
int length = 4;
SplitString testObject = new SplitString(oldString,length);
String resutl = testObject.splitIt();
System.out.print("Split String is :");
System.out.println(resutl);
浏览: 385563 次
来自: 武汉
分布式事务解决方案的效果演示(结合支付系统真实应用场景):ht ...
bo_hai 写道movies.dat 数据中有一条无效的数据 ...
movies.dat 数据中有一条无效的数据,在267行。不删 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'将字符串转换为ASCII编码数组,只要是中文字节码就是ASCII编码63即"?",所以可以由此来进行判断
&&&&class&StringOP&&&&{&&&&&&&&///&&summary&&&&&&&&&///&获取中英文混排字符串的实际长度(字节数)&&&&&&&&///&&/summary&&&&&&&&&///&&param&name="str"&要获取长度的字符串&/param&&&&&&&&&///&&returns&字符串的实际长度值(字节数)&/returns&&&&&&&&&public&int&getStringLength(string&str)&&&&&&&&{&&&&&&&&&&&&if&(str.Equals(string.Empty))&&&&&&&&&&&&&&&&return&<span style="color: #;&&&&&&&&&&&&int&strlen&=&<span style="color: #;&&&&&&&&&&&&ASCIIEncoding&strData&=&new&ASCIIEncoding();&&&&&&&&&&&&//将字符串转换为ASCII编码的字节数字&&&&&&&&&&&&byte[]&strBytes&=&strData.GetBytes(str);&&&&&&&&&&&&&for&(int&i&=&<span style="color: #;&i&&=&strBytes.Length&-&<span style="color: #;&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if&(strBytes[i]&==&<span style="color: #)&&//中文都将编码为ASCII编码63,即"?"号&&&&&&&&&&&&&&&&&&&&strlen++;&&&&&&&&&&&&&&&&strlen++;&&&&&&&&&&&&}&&&&&&&&&&&&return&&&&&&&&&}&&&&}&&&&&class&TestMain&&&&{&&&&&&&&static&void&Main()&&&&&&&&{&&&&&&&&&&&&StringOP&sop&=&new&StringOP();&&&&&&&&&&&&string&str&=&"I&Love&China!I&Love&北京!";&&&&&&&&&&&&int&iLen&=&sop.getStringLength(str);&&&&&&&&&&&&Console.WriteLine("字符串"&+&str&+&"的字节数为:"&+&iLen.ToString());&&&&&&&&&&&&Console.ReadKey();&&&&&&&&}&&&&}
&将字符串以Unicode的编码转换为字节数组,判断每个字符的第二个字节是否大于0,来计算字符串的字节数
&&&&&&& public&static&int&bytelenght(string&str)&&&&&&&&{&&&&&&&&&&&&//使用Unicode编码的方式将字符串转换为字节数组,它将所有字符串(包括英文中文)全部以2个字节存储&&&&&&&&&&&&byte[]&bytestr&=&System.Text.Encoding.Unicode.GetBytes(str);&&&&&&&&&&&&int&j&=&<span style="color: #;&&&&&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&bytestr.GetLength(<span style="color: #);&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//取余2是因为字节数组中所有的双数下标的元素都是unicode字符的第一个字节&&&&&&&&&&&&&&&&if&(i&%&<span style="color: #&==&<span style="color: #)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&j++;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&//单数下标都是字符的第2个字节,如果一个字符第2个字节为0,则代表该Unicode字符是英文字符,否则为中文字符&&&&&&&&&&&&&&&&&&&&if&(bytestr[i]&&&<span style="color: #)&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&j++;&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&&&&&return&j;&&&&&&&&}
&直接转成字节码获取长度:
byte[]&sarr&=&System.Text.Encoding.Default.GetBytes(s);&&&&int&len&=&sarr.L
阅读(...) 评论() &使用C# 开发语言,如何取得字符串的字节数。
[问题点数:0分,结帖人Du_0312]
使用C# 开发语言,如何取得字符串的字节数。
[问题点数:0分,结帖人Du_0312]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|今天要截取一个文档,发现C#中substring默认是将汉字当一个字节来截取的,但是我需要把汉字按照2个字节来算。
str="雪洁hello"
我想要前5个字节的字符,也就是"雪洁h"。
如何处理?
C#中substring默认是将汉字当一个字节来截取的,那么如何按字节数截取字符串?
using System.Collections.G
using System.W
using System.Web.UI;
using System.Web.UI.WebC
using System.T
public partial class _Default : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
String str = "雪洁之家,xuejie's blog,你好,hello";
TextBox1.Text = str.Substring(0, 8);
TextBox2.Text = SubstringByte(str, 0, 8);
TextBox3.Text = cutSubstring(str, 8);
TextBox4.Text = SubstringByte(str, 0, 3);
TextBox5.Text = cutSubstring(str, 3);
private static Encoding _encoding = System.Text.Encoding.GetEncoding("GB2312");
//第一种方法
private string SubstringByte(string text, int startIndex, int length)
byte[] bytes = _encoding.GetBytes(text);
return _encoding.GetString(bytes, startIndex, length);
//第二种方法
private string cutSubstring(string s, int length)
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
int n = 0;
表示当前的字节数
int i = 0;
要截取的字节数
for (; i & bytes.GetLength(0) && n & i++)
偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节
if (i % 2 == 0)
在UCS2第一个字节时n加1
当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节
if (bytes[i] & 0)
如果i为奇数时,处理成偶数
if (i % 2 == 1)
该UCS2字符是汉字时,去掉这个截一半的汉字
if (bytes[i] & 0)
i = i - 1;
该UCS2字符是字母或数字,则保留该字符
i = i + 1;
return System.Text.Encoding.Unicode.GetString(bytes, 0, i);
实例效果:
不用多说相信大家能看出区别,和实现方法,如有其他需求可自行添加
顺便感谢&分享的第三种方法,效果图上直接展示出其效果,至于效率问题未测试,有兴趣的朋友可以测试下。
阅读(...) 评论()下次自动登录
现在的位置:
& 综合 & 正文
C#中如何按字节数截取字符串?
今天要截取一个文档,发现C#中substring默认是将汉字当一个字节来截取的,但是我需要把汉字按照2个字节来算。
str="雪洁hello"
我想要前5个字节的字符,也就是"雪洁h"。
如何处理?
C#中substring默认是将汉字当一个字节来截取的,那么如何按字节数截取字符串?
using System.Collections.G
using System.W
using System.Web.UI;
using System.Web.UI.WebC
using System.T
public partial class _Default : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
String str = "雪洁之家,xuejie's blog,你好,hello";
TextBox1.Text = str.Substring(0, 8);
TextBox2.Text = SubstringByte(str, 0, 8);
TextBox3.Text = cutSubstring(str, 8);
TextBox4.Text = SubstringByte(str, 0, 3);
TextBox5.Text = cutSubstring(str, 3);
private static Encoding _encoding = System.Text.Encoding.GetEncoding("GB2312");
//第一种方法
private string SubstringByte(string text, int startIndex, int length)
byte[] bytes = _encoding.GetBytes(text);
return _encoding.GetString(bytes, startIndex, length);
//第二种方法
private string cutSubstring(string s, int length)
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
int n = 0;
表示当前的字节数
int i = 0;
要截取的字节数
for (; i & bytes.GetLength(0) && n & i++)
偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节
if (i % 2 == 0)
在UCS2第一个字节时n加1
当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节
if (bytes[i] & 0)
如果i为奇数时,处理成偶数
if (i % 2 == 1)
该UCS2字符是汉字时,去掉这个截一半的汉字
if (bytes[i] & 0)
i = i - 1;
该UCS2字符是字母或数字,则保留该字符
i = i + 1;
return System.Text.Encoding.Unicode.GetString(bytes, 0, i);
实例效果:
不用多说相信大家能看出区别,和实现方法,如有其他需求可自行添加
顺便感谢 分享的第三种方法,效果图上直接展示出其效果,至于效率问题未测试,有兴趣的朋友可以测试下。
【上篇】【下篇】

我要回帖

更多关于 字符串截取指定字节数 的文章

 

随机推荐