Java实现全角和半角字符相互转换

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从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" "空格
0x21U+ff01!
0x22"U+ff02"
0x23#U+ff03#
0x24$U+ff04$
0x25%U+ff05%
0x26&U+ff06&
0x27'U+ff07'
0x28U+ff08(
0x29U+ff09)
0x2a*U+ff0a*
0x2b+U+ff0b+
0x2cU+ff0c,
0x2dU+ff0d-
0x2eU+ff0e.
0x2f/U+ff0f/
0x300U+ff100
0x311U+ff111
0x322U+ff122
0x333U+ff133
0x344U+ff144
0x355U+ff155
0x366U+ff166
0x377U+ff177
0x388U+ff188
0x399U+ff199
0x3aU+ff1a:
0x3bU+ff1b;
0x3c<U+ff1c<
0x3d=U+ff1d=
0x3e>U+ff1e>
0x3fU+ff1f?
0x40@U+ff20@
0x41AU+ff21A
0x42BU+ff22B
0x43CU+ff23C
0x44DU+ff24D
0x45EU+ff25E
0x46FU+ff26F
0x47GU+ff27G
0x48HU+ff28H
0x49IU+ff29I
0x4aJU+ff2aJ
0x4bKU+ff2bK
0x4cLU+ff2cL
0x4dMU+ff2dM
0x4eNU+ff2eN
0x4fOU+ff2fO
0x50PU+ff30P
0x51QU+ff31Q
0x52RU+ff32R
0x53SU+ff33S
0x54TU+ff34T
0x55UU+ff35U
0x56VU+ff36V
0x57WU+ff37W
0x58XU+ff38X
0x59YU+ff39Y
0x5aZU+ff3aZ
0x5b[U+ff3b[
0x5c\U+ff3c\
0x5d]U+ff3d]
0x5e^U+ff3e^
0x5f_U+ff3f_
0x60`U+ff40`
0x61aU+ff41a
0x62bU+ff42b
0x63cU+ff43c
0x64dU+ff44d
0x65eU+ff45e
0x66fU+ff46f
0x67gU+ff47g
0x68hU+ff48h
0x69iU+ff49i
0x6ajU+ff4aj
0x6bkU+ff4bk
0x6clU+ff4cl
0x6dmU+ff4dm
0x6enU+ff4en
0x6foU+ff4fo
0x70pU+ff50p
0x71qU+ff51q
0x72rU+ff52r
0x73sU+ff53s
0x74tU+ff54t
0x75uU+ff55u
0x76vU+ff56v
0x77wU+ff57w
0x78xU+ff58x
0x79yU+ff59y
0x7azU+ff5az
0x7b{U+ff5b{
0x7c|U+ff5c|
0x7d}U+ff5d}
0x7eU+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及其相关视频教程~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Most

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值