平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
Java实现全角和半角字符相互转换
1 中文全角和半角输入的区别
在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为”半角”,相对地把一个汉字所占的位置称为”全角”。
2 什么是半角和全角?
2.1 全角
指一个字符占用两个标准字符位置。
全角指一个字符占用两个标准字符位置的状态。汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。全角状态下字母、数字、符号和汉字都会占两个字节的位置,也就是一个汉字那么宽。
2.2 半角
指一字符占用一个标准的字符位置。
是指英文ASCII码中的各种符号。半角的显示内码都是一个字节。半角状态下字母、数字和符号一般会占一个字节,也就是半个汉字的位置;汉字占2个字节,汉汉字属于全角。
3 全角和半角字符对应表
1)半角字符(除空格外)是从33(0x21)开始到126(0x7E)结束;
2)与半角字符对应的全角字符是从65281(unicode编码的0xFF01)开始到65374(unicode编码的0xFF3E)结束;
3)其中半角的空格是32(0x20).对应的全角空格是12288(unicode编码的0x3000);
4)半角和全角的关系很明显,除空格外的字符偏移量都是是65248(65281-33 = 65248)
全角和半角字符对应表如下:
全角和半角字符对应表 | |||
ASCII | 全角字符 | Unicode | 半角字符 |
0x20 | " "空格 | U+3000 | " "空格 |
0x21 | ! | U+ff01 | ! |
0x22 | " | U+ff02 | " |
0x23 | # | U+ff03 | # |
0x24 | $ | U+ff04 | $ |
0x25 | % | U+ff05 | % |
0x26 | & | U+ff06 | & |
0x27 | ' | U+ff07 | ' |
0x28 | ( | U+ff08 | ( |
0x29 | ) | U+ff09 | ) |
0x2a | * | U+ff0a | * |
0x2b | + | U+ff0b | + |
0x2c | , | U+ff0c | , |
0x2d | - | U+ff0d | - |
0x2e | . | U+ff0e | . |
0x2f | / | U+ff0f | / |
0x30 | 0 | U+ff10 | 0 |
0x31 | 1 | U+ff11 | 1 |
0x32 | 2 | U+ff12 | 2 |
0x33 | 3 | U+ff13 | 3 |
0x34 | 4 | U+ff14 | 4 |
0x35 | 5 | U+ff15 | 5 |
0x36 | 6 | U+ff16 | 6 |
0x37 | 7 | U+ff17 | 7 |
0x38 | 8 | U+ff18 | 8 |
0x39 | 9 | U+ff19 | 9 |
0x3a | : | U+ff1a | : |
0x3b | ; | U+ff1b | ; |
0x3c | < | U+ff1c | < |
0x3d | = | U+ff1d | = |
0x3e | > | U+ff1e | > |
0x3f | ? | U+ff1f | ? |
0x40 | @ | U+ff20 | @ |
0x41 | A | U+ff21 | A |
0x42 | B | U+ff22 | B |
0x43 | C | U+ff23 | C |
0x44 | D | U+ff24 | D |
0x45 | E | U+ff25 | E |
0x46 | F | U+ff26 | F |
0x47 | G | U+ff27 | G |
0x48 | H | U+ff28 | H |
0x49 | I | U+ff29 | I |
0x4a | J | U+ff2a | J |
0x4b | K | U+ff2b | K |
0x4c | L | U+ff2c | L |
0x4d | M | U+ff2d | M |
0x4e | N | U+ff2e | N |
0x4f | O | U+ff2f | O |
0x50 | P | U+ff30 | P |
0x51 | Q | U+ff31 | Q |
0x52 | R | U+ff32 | R |
0x53 | S | U+ff33 | S |
0x54 | T | U+ff34 | T |
0x55 | U | U+ff35 | U |
0x56 | V | U+ff36 | V |
0x57 | W | U+ff37 | W |
0x58 | X | U+ff38 | X |
0x59 | Y | U+ff39 | Y |
0x5a | Z | U+ff3a | Z |
0x5b | [ | U+ff3b | [ |
0x5c | \ | U+ff3c | \ |
0x5d | ] | U+ff3d | ] |
0x5e | ^ | U+ff3e | ^ |
0x5f | _ | U+ff3f | _ |
0x60 | ` | U+ff40 | ` |
0x61 | a | U+ff41 | a |
0x62 | b | U+ff42 | b |
0x63 | c | U+ff43 | c |
0x64 | d | U+ff44 | d |
0x65 | e | U+ff45 | e |
0x66 | f | U+ff46 | f |
0x67 | g | U+ff47 | g |
0x68 | h | U+ff48 | h |
0x69 | i | U+ff49 | i |
0x6a | j | U+ff4a | j |
0x6b | k | U+ff4b | k |
0x6c | l | U+ff4c | l |
0x6d | m | U+ff4d | m |
0x6e | n | U+ff4e | n |
0x6f | o | U+ff4f | o |
0x70 | p | U+ff50 | p |
0x71 | q | U+ff51 | q |
0x72 | r | U+ff52 | r |
0x73 | s | U+ff53 | s |
0x74 | t | U+ff54 | t |
0x75 | u | U+ff55 | u |
0x76 | v | U+ff56 | v |
0x77 | w | U+ff57 | w |
0x78 | x | U+ff58 | x |
0x79 | y | U+ff59 | y |
0x7a | z | U+ff5a | z |
0x7b | { | U+ff5b | { |
0x7c | | | U+ff5c | | |
0x7d | } | U+ff5d | } |
0x7e | ~ | U+ff5e | ~ |
4 半角和全角字符转换
4.1 打印出java中所有Unicode编码的字符
/**
* 打印出java中所有Unicode编码的字符
*/
private static void printAllCharacter() {
for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) {
System.out.println(i + " " + (char) i);
}
}
4.2 java转换半角--->全角
半角转全角java实现:
/**
* 半角转全角的函数(SBC case)
* 全角空格为12288,半角空格为32,其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
*
* @param input 任意字符串
* @return 全角字符串
*/
public static String toSbc(String input) {
if (StringUtils.isBlank(input)) {
return "";
}
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 32) {
c[i] = (char) 12288;
continue;
}
if (c[i] < 127) {
c[i] = (char) (c[i] + 65248);
}
}
return new String(c);
}
4.3 java转换全角--->半角
全角转半角java实现:
/**
* 全角转半角的函数(DBC case)
* 全角空格为12288,半角空格为32 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
*
* @param input 任意字符串
* @return 半角字符串
*/
public static String toDbc(String input) {
if (StringUtils.isBlank(input)) {
return "";
}
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 12288) {
c[i] = (char) 32;
continue;
}
if (c[i] > 65280 && c[i] < 65375) {
c[i] = (char) (c[i] - 65248);
}
}
return new String(c);
}
5 测试
5.1 main测试方法
public static void main(String[] args) {
String str = "半角符号示例:,!~ 全角符号示例:,!~";
System.out.println("半角--->全角转换前:" + str);
String sbcResult = toSbc(str);
System.out.println("半角--->全角转换后:" + sbcResult);
System.out.println("全角--->半角转换前:" + str);
String dbcResult = toDbc(str);
System.out.println("全角--->半角转换后:" + dbcResult);
//打印出java所有字符
// printAllCharacter();
}
5.2 测试结果
Tips:如果不想对数字和大小写字母进行全角转换。那么代码里面不要处理就行了!加个if语句判断下~
6 全部代码
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
String str = "半角符号示例:,!~ 全角符号示例:,!~";
System.out.println("半角--->全角转换前:" + str);
String sbcResult = toSbc(str);
System.out.println("半角--->全角转换后:" + sbcResult);
System.out.println("全角--->半角转换前:" + str);
String dbcResult = toDbc(str);
System.out.println("全角--->半角转换后:" + dbcResult);
//打印出java所有字符
// printAllCharacter();
}
/**
* 半角转全角的函数(SBC case)
* 全角空格为12288,半角空格为32,其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
*
* @param input 任意字符串
* @return 全角字符串
*/
public static String toSbc(String input) {
if (StringUtils.isBlank(input)) {
return "";
}
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 32) {
c[i] = (char) 12288;
continue;
}
if (c[i] < 127) {
c[i] = (char) (c[i] + 65248);
}
}
return new String(c);
}
/**
* 全角转半角的函数(DBC case)
* 全角空格为12288,半角空格为32 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
*
* @param input 任意字符串
* @return 半角字符串
*/
public static String toDbc(String input) {
if (StringUtils.isBlank(input)) {
return "";
}
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 12288) {
c[i] = (char) 32;
continue;
}
if (c[i] > 65280 && c[i] < 65375) {
c[i] = (char) (c[i] - 65248);
}
}
return new String(c);
}
/**
* 打印出java中所有Unicode编码的字符
*/
private static void printAllCharacter() {
for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) {
System.out.println(i + " " + (char) i);
}
}
}
关注微信公众号,免费获取java及其相关视频教程~