`
maoone2003
  • 浏览: 57521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java全角半角项目转换及去除全/半角空格

阅读更多
今天项目中遇到一个二字节空白的问题,让人十分头疼,研究了半天才知道是全角空格,现将一点心得分享(有抄袭的部分),嘿嘿
package com.eg.demo;

/**
 * 半角全角转换及替换半角全角空白
 * @author maochangming
 */
public class Test {
	public static void main(String[] args) throws Exception {
		try {
			//去首尾空格,不管是全角半角:
			String s = "nihaohk    nihehe     ";
			System.out.println("s.length=" + s.length());
			// s = s.replaceAll("^\\s*|\\s*$", "");
			s = s.replaceAll("(^[ | ]*|[ | ]*$)", "");
			s = s.replaceAll(" ", "");
			System.out.println("s.length=" + s.length());
			System.out.println("s===" + s);

			String QJstr = "HELLO";
			String QJstr1 = "HELLO";

			String result = BQchange(QJstr);
			String result1 = QBchange(QJstr1);

			System.out.println(QJstr + "\n" + result);
			System.out.println(QJstr1 + "\n" + result1);
		} catch (Exception ex) {
			throw new Exception("ERROR:" + ex.getMessage());
		}
	}

	/**
	 * 半角转全角
	 * @param QJstr
	 * @return
	 */
	public static final String BQchange(String QJstr) {
		String outStr = "";
		String Tstr = "";
		byte[] b = null;

		for (int i = 0; i < QJstr.length(); i++) {
			try {
				Tstr = QJstr.substring(i, i + 1);
				b = Tstr.getBytes("unicode");
			} catch (java.io.UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			if (b[3] != -1) {
				b[2] = (byte) (b[2] - 32);
				b[3] = -1;
				try {
					outStr = outStr + new String(b, "unicode");
				} catch (java.io.UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} else
				outStr = outStr + Tstr;
		}

		return outStr;
	}

	/**
	 * 全角转半角
	 * @param QJstr
	 * @return
	 */
	public static final String QBchange(String QJstr) {
		String outStr = "";
		String Tstr = "";
		byte[] b = null;

		for (int i = 0; i < QJstr.length(); i++) {
			try {
				Tstr = QJstr.substring(i, i + 1);
				b = Tstr.getBytes("unicode");
			} catch (java.io.UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			if (b[3] == -1) {
				b[2] = (byte) (b[2] + 32);
				b[3] = 0;
				try {
					outStr = outStr + new String(b, "unicode");
				} catch (java.io.UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} else
				outStr = outStr + Tstr;
		}

		return outStr;
	}

}
分享到:
评论
3 楼 勇-高 2012-06-07  
做过实验了,你这个方法不是通用的,UTF8编码的全角字符就无法正常转换为半角
2 楼 maoone2003 2007-11-03  
首先请楼上先看如下代码:

//测试单字符不同的字符集返回的字节数
byte[] bb = null;
String str = "h";
bb = str.getBytes("gb2312");
System.out.println("bb.length=" + bb.length);
bb = str.getBytes("unicode");
System.out.println("bb.length=" + bb.length);
//输出结果如下:
//bb.length=1
//bb.length=4

//测试字符串不同字符集返回的字节数
byte[] bb1 = null;
String str1 = "hello";
bb1 = str1.getBytes("gb2312");
System.out.println("bb1.length=" + bb1.length);
bb1 = str1.getBytes("unicode");
System.out.println("bb1.length=" + bb1.length);
//输出结果如下:
//bb1.length=5
//bb1.length=12
测试结果截然不同:
引用
在 UNICODE 被采用之前,计算机想要记录一段文字,内存中实际存放的内容是:按照指定编码规则得到的字节串。也就是按照 ANSI 编码方式存储在内存中的。比如:在中文 DOS, Windows 95, Windows 98 操作系统中,字符串 "中文123" 存放在内存中时,实际存放的是 [D6][D0][CE][C4][31][32][33] 这7个字节。('中' 和 '文' 分别占2个字节。) 而在 UNICODE 被采用之后,计算机想要记录一段文字时,内存中不再存放根据特定编码而得到的字节串,而改为存放各个字符在 UNICODE 中的序号。比如:在 Windows NT/2000/XP, Linux, Java 系统中,字符串 "中文123" 存放在内存中时,实际记录的是 20013, 25991, 49, 50, 51 这5个序号。当不同语言中的字符需要同时表示时,不会因为编码冲突而无法表示。 字符串实际所占内存空间的大小,要取决于当前系统采用多少字节来存放一个“序号”。如果使用2个字节存放一个序号,那么 "中文123" 在内存中就占10个字节。如果使用4个字节存放一个序号,那么 "中文123" 就占20个字节。
具体我也不是非常理解,楼上可以有空多搜一下相关的资料看看,共同学习,共同进步,呵呵
1 楼 yangdefeng95802 2007-11-03  
你的那里的if (b[3] != -1) {  
                b[2] = (byte) (b[2] - 32);  
                b[3] = -1;  

为什么总是b[3]和b[2]来做比较?这里我没有怎么看明白?能不能给解释一下!谢谢了!

相关推荐

Global site tag (gtag.js) - Google Analytics