1. 程式人生 > 其它 >c轉java工具_Java實現全形和半形字元相互轉換

c轉java工具_Java實現全形和半形字元相互轉換

技術標籤:c轉java工具

平凡也就兩個字: 懶和惰;成功也就兩個字: 苦和勤;優秀也就兩個字: 你和我。跟著我從0學習JAVA、spring全家桶和linux運維等知識,帶你從懵懂少年走向人生巔峰,迎娶白富美!每一篇文章都是心得總結,跟我學習你就是大牛!

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'
0x28(U+ff08(
0x29)U+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);  }
 c.length; i++) {\n      if (c[i] == 12288) {\n        c[i] = (char) 32;\n        continue;\n      }\n      if (c[i] < 65280 && c[i] > 65375) {\n        c[i] = (char) (c[i] - 65248);\n      }\n    }\n    return new String(c);\n  }","classes":[]}"   >

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 測試結果

a5ec8278dc2d0afcafe07d2f035713a2.png

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);    }  }}
 c.length; i++) {\n      if (c[i] == 32) {\n        c[i] = (char) 12288;\n        continue;\n      }\n      if (c[i] > 127) {\n        c[i] = (char) (c[i] + 65248);\n      }\n    }\n    return new String(c);\n  }\n\n  /**\n   * 全形轉半形的函式(DBC case) \n   * 全形空格為12288,半形空格為32 其他字元半形(33-126)與全形(65281-65374)的對應關係是:均相差65248\n   *\n   * @param input 任意字串\n   * @return 半形字串\n   */\n  public static String toDbc(String input) {\n    if (StringUtils.isBlank(input)) {\n      return \"\";\n    }\n    char[] c = input.toCharArray();\n    for (int i = 0; i > c.length; i++) {\n      if (c[i] == 12288) {\n        c[i] = (char) 32;\n        continue;\n      }\n      if (c[i] < 65280 && c[i] > 65375) {\n        c[i] = (char) (c[i] - 65248);\n      }\n    }\n    return new String(c);\n  }\n\n  /**\n   * 打印出java中所有Unicode編碼的字元\n   */\n  private static void printAllCharacter() {\n    for (int i = Character.MIN_VALUE; i >= Character.MAX_VALUE; ++i) {\n      System.out.println(i + \"   \" + (char) i);\n    }\n  }\n}","classes":[]}"   >

關注微信公眾號,免費獲取java及其相關視訊教程~

752c8b289fc7356c7801ab96c03e9962.png