C#、Java实现按字节截取字符串,字符串中包含中文汉字和英文字符数字标点符号等。

在实际项目应用过程中,尤其是在web开发时可能遇到的比较多,就以我的(JiYF笨小孩管理系统)为例,再发布文章时候,文章摘要如果用户没有填写,默认截取文章前面255个字节,这个时候里面难免包含中文汉字,英文字母,标点符号等等有可能就会遇到截取出半个汉字的情况。

以Unicode 16(UCS2)编码为例,每一个字符占用俩个字节

假如字符串s:

String s = "潮哥shuo丑安ni去哪?"; 

上面的s字符串既有汉字,又有英文字符和数字

举例:

如果要截取前6个字节的字符,应该是”潮哥sh",但如果用substring方法截取前6个字符就成了"潮哥shuo"。

如果截取9个字节,应该是“潮哥shuo” 丑的半个汉字就去掉了,但如果用substring方法截取前9个字符就成了"潮哥shuo丑安n"。

产生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。 要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:

C#代码示例:

  1. private static string cutSubstring(string str, int length)
  2. {
  3. if (str == null || str.Length == || length < )
  4. {
  5. return "";
  6. }
  7.  
  8. byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str);
  9. int n = ; // 表示当前的字节数
  10. int i = ; // 要截取的字节数
  11. for (; i < bytes.GetLength() && n < length; i++)
  12. {
  13. // 偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节
  14. if (i % == )
  15. {
  16. n++; // 在UCS2第一个字节时n加1
  17. }
  18. else
  19. {
  20. // 当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节
  21. if (bytes[i] > )
  22. {
  23. n++;
  24. }
  25. }
  26. }
  27. // 如果i为奇数时,处理成偶数
  28. if (i % == )
  29. {
  30. // 该UCS2字符是汉字时,去掉这个截一半的汉字
  31. if (bytes[i] > )
  32. i = i - ;
  33. // 该UCS2字符是字母或数字,则保留该字符
  34. else
  35. i = i + ;
  36. }
  37. return System.Text.Encoding.Unicode.GetString(bytes, , i);
  38. }

分析:

测试结果:

调用

  1. cutSubstring("潮哥shuo丑安ni去哪?",6);------>运行结果:“潮哥sh
  1. cutSubstring("潮哥shuo丑安ni去哪?",9);------>运行结果:“潮哥shuo

Java代码示例:

(细心的童鞋会发现i值不同,java是从2开始C#从0开始,这里注意,java转换为字节数组,前俩个字节是标志位,所以第0位和第1位是标志位,从2开始)

  1. public static String bSubstring(String s, int length) throws Exception
  2. {
  3.  
  4. byte[] bytes = s.getBytes("Unicode");
  5. int n = ; // 表示当前的字节数
  6. int i = ; // 要截取的字节数,从第3个字节开始
  7. for (; i < bytes.length && n < length; i++)
  8. {
  9. // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
  10. if (i % == )
  11. {
  12. n++; // 在UCS2第二个字节时n加1
  13. }
  14. else
  15. {
  16. // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
  17. if (bytes[i] != )
  18. {
  19. n++;
  20. }
  21. }
  22. }
  23. // 如果i为奇数时,处理成偶数
  24. if (i % == )
  25.  
  26. {
  27. // 该UCS2字符是汉字时,去掉这个截一半的汉字
  28. if (bytes[i - ] != )
  29. i = i - ;
  30. // 该UCS2字符是字母或数字,则保留该字符
  31. else
  32. i = i + ;
  33. }
  34.  
  35. return new String(bytes, , i, "Unicode");
  36. }

测试结果:

调用

  1. cutSubstring("潮哥shuo丑安ni去哪?",6);------>运行结果:“潮哥sh
  1. cutSubstring("潮哥shuo丑安ni去哪?",9);------>运行结果:“潮哥shuo

C#、Java实现按字节截取字符串包含中文汉字和英文字符数字标点符号等的更多相关文章

  1. Java中根据字节截取字符串

    一.简介 为了统一世界各国的字符集,流行开了Unicode字符集,java也支持Unicode编码,即java中char存的是代码点值,即无论是‘A’还是‘中’都占两个字节. 代码点值:与Unicod ...

  2. java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

    /*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...

  3. Java按字节截取字符串(GBK编码、UTF-8编码实现)

    package FileDemo; import java.io.IOException; public class CutStringTest { /** * @param args * @thro ...

  4. javascript 高效按字节截取字符串

    做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,各种坑. 让后台程序截一下,又各种推托,让后台按字节截一下更是和要了后台老命一样,最后可能只会安字 ...

  5. java截取字符串中的最后几个字符

    Java中的String类提供了一个substring(int from, int to)方法用于截取字符串中位置为from到to-1位置的字符. 因为字符串的字符位置是从0开始的,而substrin ...

  6. PHP用substr截取字符串出现中文乱码问题用mb_substr

    PHP用substr截取字符串出现中文乱码问题用mb_substr实例:mb_substr('截取中文乱码问题测试',0,5, 'utf-8'); 语法 : string substr (string ...

  7. C#返回字符串的字节长度,一个中文算两个字符的代码

    如下代码段是关于C#返回字符串的字节长度,一个中文算两个字符的代码. public static int GetLength(string str) { if (str.Length == 0) re ...

  8. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  9. SQL Server判断某个字段是否包含中文/英文字符/数字

    原文:SQL Server判断某个字段是否包含中文/英文字符/数字 因最近在清理系统中的脏数据,需要查询某个字段是否包含中文/英文字符/数字的数据, 比较简单,仅以此篇博客做一个简单总结,方便以后查阅 ...

随机推荐

  1. python_不用循环打印1-1000

    题目:屏幕上打印1-1000这1000个数, 不许使用循环语句/条件语句,不许使用?:算符. 不许在源代码中用列举输出语句的办法傻打,比如一千个print语句不行,不再赘述其他傻打行为, 大家都能领会 ...

  2. CSS :after、before、<!DOCTYPE>

    <!DOCTYPE> <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. CSS :选择器 after,before

  3. 【转】IOS 学习之 NSPredicate 模糊、精确、查询

    转自:http://blog.csdn.net/lianbaixue/article/details/10579117   简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于S ...

  4. NFS介绍 NFS服务端安装配置 NFS配置选项

    NFS 介绍 • NFS是Network File System的缩写 • NFS最早由Sun公司开发,分2,,4三个版本,2和3由Sun起草开发,.0开始Netapp公司参与并主导开发,最新为4.1 ...

  5. LNMP架构介绍 MySQL安装 PHP安装 Nginx介绍

  6. 【转帖】Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGo

     Linux发行版:CentOS.Ubuntu.RedHat.Android.Tizen.MeeGo作者:阳光岛主 原文在这儿 Linux,最早由Linus Benedict Torvalds在199 ...

  7. fopen flock fclose 文件用法

    fopen函数是用来打开文件或者连接 若成功,则返回 true.若失败,则返回 false. fopen打开连接是不能直接输出的 使用: <?php $file = fopen("te ...

  8. idea中mybatis generator自动生成代码配置 数据库是sqlserver

    好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...

  9. jquery.form 和MVC4做无刷新上传DEMO

    jquery.form 和MVC4做无刷新上传DEMO HTML: <script src="~/Scripts/jquery-1.10.2.min.js"></ ...

  10. centos7系统下nginx安装并配置开机自启动操作

    准备工作 我的centos7系统是最小化安装的, 缺很多库, 首先安装必须的运行库 ? 1 2 3 4 5 6 7 8 9 10 11 yum install wget gcc gcc-c++ pcr ...