- 浏览: 130476 次
- 性别:
- 来自: ...
文章分类
最新评论
最近接触到一道字符串截取的编程题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个"。
了解Java的都知道Java中char是用Unicode-16表示的,char型占两个字节。通常采用Unicode-16的编码,一个代码单元就可以表示一个字符,极特殊的辅助字符需要一对代码单元来表示。String的length()方法返回的就是代码单元的数量。问题就在于汉字也好,普通字母数字也好基本上都是一个代码单元就能表示,所以无法区分。但是这些非西欧字符集虽然也是占两个字节,但是西欧字符的高8位是置0的,利用这个性质可以尝试写一个解决方案。
这里主要利用了int t = tmp & 0xff00截得字符的高8位进行判断,针对汉字这样的方案应该是可行的,如果是一些占有两个代码单元的,还要去使用找代码点的方法进行进一步的分割。
了解Java的都知道Java中char是用Unicode-16表示的,char型占两个字节。通常采用Unicode-16的编码,一个代码单元就可以表示一个字符,极特殊的辅助字符需要一对代码单元来表示。String的length()方法返回的就是代码单元的数量。问题就在于汉字也好,普通字母数字也好基本上都是一个代码单元就能表示,所以无法区分。但是这些非西欧字符集虽然也是占两个字节,但是西欧字符的高8位是置0的,利用这个性质可以尝试写一个解决方案。
/** * @author: yanxuxin * @date: 2010-3-10 */ public class SplitString { public static void main(String[] args) { splitStr("我ABC", 4); splitStr("我ABC汉DEF", 6); } public static void splitStr(String s, int bytes) { int offset = 0; //计算位数偏移量 int i = 0; //统计实际代码单元数 for (; i < s.length(); i++) { char tmp = s.charAt(i); int t = tmp & 0xff00; //截取高8位进行判断 if (t > 0) { offset += 2; } else { offset++; } if (offset >= bytes) { if (offset == bytes) { i++; } break; } } System.out.println("Result=" + s.substring(0, i)); } }
这里主要利用了int t = tmp & 0xff00截得字符的高8位进行判断,针对汉字这样的方案应该是可行的,如果是一些占有两个代码单元的,还要去使用找代码点的方法进行进一步的分割。
发表评论
文章已被作者锁定,不允许评论。
-
一道位操作的趣味编程题
2010-03-14 10:50 2081看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道多线程趣味热身题
2010-02-28 18:01 1912保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4904来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4517分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11571线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12835ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8134之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15369随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2788近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5394一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7506说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7674之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2435之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1866早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3546在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2716说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2522前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2664对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3066最近写关于并发的小应 ... -
由destory-method引发的IOC容器设计的思考
2009-12-07 16:51 1679第一次读Spring的源 ...
相关推荐
自己写的字符串截取,很灵活,很好用。你也可以自己修改。
substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 ...
使用一个指定的分隔符把一个字符串分割存储到数组 使用您选择的分隔符将一个数组合并为一个字符串 返回字符串中匹配子串的第一个字符的下标
shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串截取shell中字符串...
C#开发中经常用到一些字符串截取的函数,文档中含有大多数的函数
VC++字符串截取总结,对初学者很有好处的
java 字符串截取工具类java 字符串截取工具类
字符串截取字符的超强方法【引用】字符串截取字符的超强方法【引用】字符串截取字符的超强方法【引用】
一个关于字符串匹配的算法,已经经过编译,希望对你有帮助
Delphi 字符串截取函数详细应用以及例子
名称 :盛飞字符串截取函数 作用 :按指定首尾字符串截取内容(本函数为从左向右截取)
用于js或者java后台截取字符串方法,有效
php字符串截取.pdf
shell 字符串 截取 查找 替换 shell 字符串 截取 查找 替换 shell 字符串 截取 查找 替换 shell 字符串 截取 查找 替换
13年(实习期间)飞娱互动有限公司面试游戏开发客户端/服务器端时的面试题的第一道编程题,当时就差这题没做出来,回去后想出来的。 截取一定长度的字符串,保证不把汉字截断。
自己输入一个字符串,字符串中可以包括字符和汉字,截取指定的字符串
各种不同的需要截取字符串的方法。一般都是一句话搞定
C++字符串截取,例如:"adda,dagf,dfa,df",将','去除,将每部分字符出入一个指定数组
C#字符串截取固定长度的方法
给写了2个方法,一个是直接截取单个需要的字符串,比如字符串string a="ab123456",我只需要提取3,那么就是单独截取就可以了,从2开始到4结束就行。 第二个是把所有的符合条件的字符串都截取出来,提取出来,比如...