C#、Java实现按字节截取字符串包含中文汉字和英文字符数字标点符号等
2017-03-13 16:59
706 查看
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#代码示例:
private static string cutSubstring(string str, int length) { if (str == null || str.Length == 0 || length < 0) { return ""; } byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str); 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); }
分析:
测试结果:
调用
cutSubstring("潮哥shuo丑安ni去哪?",6);------>运行结果:“潮哥sh”
cutSubstring("潮哥shuo丑安ni去哪?",9);------>运行结果:“潮哥shuo”
Java代码示例:
(细心的童鞋会发现i值不同,java是从2开始C#从0开始,这里注意,java转换为字节数组,前俩个字节是标志位,所以第0位和第1位是标志位,从2开始)
public static String bSubstring(String s, int length) throws Exception { byte[] bytes = s.getBytes("Unicode"); int n = 0; // 表示当前的字节数 int i = 2; // 要截取的字节数,从第3个字节开始 for (; i < bytes.length && n < length; i++) { // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节 if (i % 2 == 1) { n++; // 在UCS2第二个字节时n加1 } else { // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节 if (bytes[i] != 0) { n++; } } } // 如果i为奇数时,处理成偶数 if (i % 2 == 1) { // 该UCS2字符是汉字时,去掉这个截一半的汉字 if (bytes[i - 1] != 0) i = i - 1; // 该UCS2字符是字母或数字,则保留该字符 else i = i + 1; } return new String(bytes, 0, i, "Unicode"); }
测试结果:
调用
cutSubstring("潮哥shuo丑安ni去哪?",6);------>运行结果:“潮哥sh”
cutSubstring("潮哥shuo丑安ni去哪?",9);------>运行结果:“潮哥shuo”
相关文章推荐
- 获取包含中文,字母,数字集合的字符串的长度(1个汉字字符存储需要2个字节,1个英文字符存储需要1个字节)
- (Map实现)有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数
- java 集合 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数
- 从一个包含汉字和其他字符的字符串中截取指定字节长度的字符串,不可以出现中文乱码
- 设计函数,输入为一个字符串,里边包含中文、英文、数字等字符,编码为GBK。中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意。
- C#实现将汉字与英文字符混和字符串中的汉字转换为拼音
- C#实现将汉字与英文字符混和字符串中的汉字转换为拼音
- java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字
- 给定一个字符串,包含中文字符和英文字符,取给定大小字节的子串。
- c# 正则验证 只能中文,英文,数字下划线,首个字符不能数字,6-20个字节
- java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字 分类: Android JAVA 2015-06-07 21:08 31人阅读 评论(0) 收藏
- C# 按长度截取字符串(区别汉字,英文,数字)
- C# 字符、字符串过滤,只能输入数字、中文、英文、大写、小写(转)
- java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字
- 求中英文混合字符串长度,中英文混合字符串截取(汉字2个字节,字母数字等1个字节),字符转ASCII码,ASCII码转字符
- 给定一个字符串,包含中文字符和英文字符,取给定大小字节的子串。
- java 字符串截取类 区分中文、英文、数字、标点符号
- 如何实现按字节截取字符串(中文占2字节,英文占1字节,substring())?
- 用Java实现按字节长度截取中英文数字字符串的方法总结
- java 正则表达式 验证字符串 只包含汉字英文数字