字符串半角全角互转详解

原创 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);
	}
}


Java工具类——全角半角字符相互转换

import org.apache.commons.lang.StringUtils;          /**    *     * 提供对字符串的全角->半角,半角->全角转换    *...
  • xyw591238
  • xyw591238
  • 2016年06月20日 11:53
  • 5299

全角半角字符相互转换

import org.apache.commons.lang.StringUtils; /** * * 提供对字符串的全角->半角,半角->全角转换 * ...
  • ycb1689
  • ycb1689
  • 2017年05月02日 10:00
  • 320

JS/JQ截取字符串长度的函数处理不同半角全角英文字符功能

// str 截取长度为 len function MySubStr(str,len){ var len2 = len; var str2 = ""; var ch = '';...
  • iewter7774
  • iewter7774
  • 2015年05月19日 21:46
  • 948

Lua UTF-8 全角转半角

根据UTF-8的编码规则,可以知道: 1. 全角空格为12288,半角空格为32  2. 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248  但是UTF...
  • SKY453589103
  • SKY453589103
  • 2017年07月29日 20:36
  • 460

java中全角半角字符的相互转换

import org.apache.commons.lang.StringUtils; /** * * 提供对字符串的全角->半角,半角->全角转换 * */ public ...
  • paincupid
  • paincupid
  • 2016年08月18日 14:12
  • 1031

中文输入法中的全角和半角的区别

摘自:http://blog.csdn.NET/kevinhg/article/details/8702462 在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"...
  • XianRenShan
  • XianRenShan
  • 2017年07月30日 16:12
  • 1464

php字符串处理之全角半角转换(正则匹配全角字符思路)

半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。 一、概念 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)例如:/[\x...
  • h330531987
  • h330531987
  • 2017年04月14日 21:15
  • 760

ORACLE SQL半角全角转换

在其际应用中尽量保证使用主qvfp
  • x_focus
  • x_focus
  • 2014年08月27日 10:44
  • 1772

Java去掉全角空格和半角空格

Java去掉全角空格和半角空格
  • javaniuniu
  • javaniuniu
  • 2016年08月16日 12:11
  • 2429

Mysql中全角半角问题

1,手机号码全角转换成半角 先查询出来全角半角都存在的手机号码的数据 SELECT a.username ,COUNT(1) AS num FROM(  SELECT REPLACE(REPLACE(...
  • u011287511
  • u011287511
  • 2017年06月20日 09:44
  • 432
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串半角全角互转详解
举报原因:
原因补充:

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