字符串半角全角互转详解

原创 2015年07月07日 19:15:37

全角和半角之间的互相转换。

 ASCII的一些知识。

\n 回车换行  

\t 横向跳到下一制表位置  

\v 竖向跳格  

\b 退格  

\r 回车  

\f 走纸换页  

\\ 反斜线符"\"  

\' 单引号符  

\ddd 1~3位八进制数所代表的字符  

\xhh 1~2位十六进制数所代表的字符


空格的ASCII是32,转换为16进制是x20,使用转义字符为 \x20

ASCII码表

ASCII码表

下面贴代码,在参考别人的基础上另作整理。

package com.kongming.someuseful;

/**
 * @author ACER
 * 
 *         实现对字符串中全角字符和半角字符的互相转换
 */
public class QuanJiao_BanJiao_Transform {

	// ASCII表中可见字符从!开始,值为33(Decimal),半角对应字符为 !
	static final char DBC_CHAR_START = 33;

	// ASCII表中可见字符到~结束,值为126(Decimal),半角对应字符为 ~
	static final char DBC_CHAR_END = 126;

	// 全角对应于ASCII表的可见字符从!开始,值为65281 ,全角对应字符为 !
	static final char SBC_CHAR_START = 65281;

	// 全角对应于ASCII表的可见字符到~结束,值为65374,全角对应字符为 ~
	static final char SBC_CHAR_END = 65374;

	// ASCII表中除空格外的可见字符与对应的全角字符的相对偏移,全角半角转换偏移量为65248
	static final int CONVERT_STEP = 65248;

	// 全角空格的值,没有遵循上面说的ASCII的相对偏移量,必须单独处理,全角空格 ASCII值为12288
	static final char SBC_SPACE = 12288;

	// 半角空格的值,ASCII值为32(Decimal),半角空格 ' '
	static final char DBC_SPACE = 32;

	/**
	 * --半角字符转为全角字符
	 * 
	 * @param src
	 *            包含半角字符的字符串
	 * @return 返回全角字符的字符串
	 */
	public static String bj2qj(String src) {
		if (src == null) {
			return src;
		}
		StringBuilder buf = new StringBuilder(src.length());
		char[] ca = src.toCharArray();
		for (int i = 0; i < ca.length; i++) {
			// 如果是半角空格,直接用全角空格替代
			if (ca[i] == DBC_SPACE) {
				buf.append(SBC_SPACE);
				// 字符是!到~之间的可见字符
			} else if ((ca[i] >= DBC_CHAR_START) && (ca[i] <= DBC_CHAR_END)) {
				buf.append((char) (ca[i] + CONVERT_STEP));
				// 不对空格以及ascii表中其他可见字符之外的字符做任何处理
			} else {
				buf.append(ca[i]);
			}
		}
		return buf.toString();
	}

	/**
	 * --全角字符转为半角字符
	 * 
	 * @param src
	 *            包含全角字符的字符串
	 * @return 返回半角字符的字符串
	 */
	public static String qj2bj(String src) {
		if (src == null) {
			return src;
		}
		StringBuilder buf = new StringBuilder(src.length());
		char[] ca = src.toCharArray();
		for (int i = 0; i < src.length(); i++) {
			// 如果位于全角!到全角~区间内
			if (ca[i] >= SBC_CHAR_START && ca[i] <= SBC_CHAR_END) {
				buf.append((char) (ca[i] - CONVERT_STEP));
				// 如果是全角空格
			} else if (ca[i] == SBC_SPACE) {
				buf.append(DBC_SPACE);
				// 不处理全角空格,全角!到全角~区间外的字符
			} else {
				buf.append(ca[i]);
			}
		}
		return buf.toString();
	}

	// 测试
	public static void main(String[] args) {
		String qj = "kmsocial,周杰。. -。-";
		String bj = "kmsocial,周杰. -.-";

		String qj2bj = QuanJiao_BanJiao_Transform.qj2bj(qj);
		String bj2qj = QuanJiao_BanJiao_Transform.bj2qj(bj);

		System.out.println("转换前:" + qj + "\n转换后:" + qj2bj);
		System.out.println("转换前:" + bj + "\n转换后:" + bj2qj);
	}
}


相关文章推荐

半角、全角 字符串互转\提取中文或数字

/*   半角字符串转全角 */ if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_i...

PB中全角与半角互转函数

  • 2011年12月27日 21:29
  • 1KB
  • 下载

全角半角互转 c#

  • 2013年06月08日 10:57
  • 41KB
  • 下载

C++全角与半角互转

1.全角:指一个字符占用两个标准字符位置。汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。...

C#实现字符串全角半角转换类

  • 2008年06月18日 09:27
  • 2KB
  • 下载

按指定长度截取字符串,考虑全角半角

关于用Java来截取指定长度的字符串,我在网上看到很多帖子和方法,大都是说用substring(),但是如果考虑到全角半角的话,这是怎么也达不到期望值的。因为之前自己也用到过,所以把自己整理好的一些东...

python 判断unicode字符串是汉字/数字/字母,全角/半角转换

文本处理经常会判断字符串是否是字母,数字或者汉字的问题,python str模块提供了些方法,但是不支持unicode,所以模仿str的相关方法,实现了unicode 字符串的汉字/数字/字母判断方法...
  • xuh5156
  • xuh5156
  • 2013年06月17日 13:55
  • 3552

C# 字符串全角 半角转换

using System; namespace SFiresoft.Util { /// /// 字符串操作辅助类 /// /// /// 创建者:su...
  • sucsy
  • sucsy
  • 2013年05月29日 12:59
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串半角全角互转详解
举报原因:
原因补充:

(最多只允许输入30个字)