詳解全形和半形的轉換

阿赫瓦里發表於2015-02-08

   最近在專案中遇到一個問題,客戶上傳的檔案無法下載下來,經過定位發現原來客戶上傳的檔名中包含很多全形字元導致無法解析,找不到對應的檔案,其實檔案是真實存在的,只是用的上傳下載元件不支援全形字元的檔名,從而導致檔案找到不到,無法下載。

  所以本人就對全形和半形進行了一些分析和總結以及它們之間用java程式碼是如何進行轉換的經驗同各位園友進行分享,希望大家共同學習,共同進步,不足之處,請大家不吝指出。

  好了,進入正題.........

全形和半形簡介

  全形是一種電腦字元,且每個全形字元佔用兩個標準字元(或半形字元)位置。每個普通字元(或半形字元)只佔用一位元組的空間(一位元組有8位,共256個編碼空間),而漢語、日語、及朝鮮文等文字語言的字型檔 量遠大於256個,所以改用兩個位元組來儲存。同時,也是因為中日韓等文字的書寫習慣,如果統一使用全形字元的話,排列起來也顯得整齊。為了排列整齊,英文和其它拉丁文的字元和標點也提供了全形格式。通常的英文字母、數字鍵、符號鍵都是半形的,半形的顯示內碼都是一個位元組。在系統內部,以上三種字元是作為基本程式碼處理的, 所以使用者輸入命令和引數時一般都使用半形。全形與半形有什麼區別?各在什麼情況下使用?全形佔兩個位元組,半形佔一個位元組。半形全形主要是針對標點符號來說的,全形標點佔兩個位元組,半形佔一個位元組,而不管是半形還是全形,漢字都還是要佔兩個位元組。在程式設計序的原始碼中只能使用半形標點(不包括字串內部的資料)。在不支援漢字等語言的計算機上只能使用半形標點(其實這種情況根本就不存在半形全形的概念) 。,.?\'! ……這些是半形的,。?‘! ……這些是全形的。

全形和半形的比較

ASCII
全形字元
Unicode
半形字元
Unicode
0x20
""空格
U+3000
" "空格
U+0020
0x21
U+ff01
!
U+0021
0x22
"
U+ff02
"
U+0022
0x23
#
U+ff03
#
U+0023
0x24
$
U+ff04
$
U+0024
0x25
%
U+ff05
%
U+0025
0x26
&
U+ff06
&
U+0026
0x27
'
U+ff07
'
U+0027
0x28
U+ff08
(
U+0028
0x29
U+ff09
)
U+0029
0x2a
*
U+ff0a
*
U+002a
0x2b
+
U+ff0b
+
U+002b
0x2c
U+ff0c
,
U+002c
0x2d
U+ff0d
-
U+002d
0x2e
U+ff0e
.
U+002e
0x2f
/
U+ff0f
/
U+002f
0x30
0
U+ff10
0
U+0030
0x31
1
U+ff11
1
U+0031
0x32
2
U+ff12
2
U+0032
0x33
3
U+ff13
3
U+0033
0x34
4
U+ff14
4
U+0034
0x35
5
U+ff15
5
U+0035
0x36
6
U+ff16
6
U+0036
0x37
7
U+ff17
7
U+0037
0x38
8
U+ff18
8
U+0038
0x39
9
U+ff19
9
U+0039
0x3a
U+ff1a
:
U+003a
0x3b
U+ff1b
;
U+003b
0x3c
<
U+ff1c
<
U+003c
0x3d
=
U+ff1d
=
U+003d
0x3e
>
U+ff1e
>
U+003e
0x3f
U+ff1f
?
U+003f
0x40
@
U+ff20
@
U+0040
0x41
A
U+ff21
A
U+0041
0x42
B
U+ff22
B
U+0042
0x43
C
U+ff23
C
U+0043
0x44
D
U+ff24
D
U+0044
0x45
E
U+ff25
E
U+0045
0x46
F
U+ff26
F
U+0046
0x47
G
U+ff27
G
U+0047
0x48
H
U+ff28
H
U+0048
0x49
I
U+ff29
I
U+0049
0x4a
J
U+ff2a
J
U+004a
0x4b
K
U+ff2b
K
U+004b
0x4c
L
U+ff2c
L
U+004c
0x4d
M
U+ff2d
M
U+004d
0x4e
N
U+ff2e
N
U+004e
0x4f
O
U+ff2f
O
U+004f
0x50
P
U+ff30
P
U+0050
0x51
Q
U+ff31
Q
U+0051
0x52
R
U+ff32
R
U+0052
0x53
S
U+ff33
S
U+0053
0x54
T
U+ff34
T
U+0054
0x55
U
U+ff35
U
U+0055
0x56
V
U+ff36
V
U+0056
0x57
W
U+ff37
W
U+0057
0x58
X
U+ff38
X
U+0058
0x59
Y
U+ff39
Y
U+0059
0x5a
Z
U+ff3a
Z
U+005a
0x5b
[
U+ff3b
[
U+005b
0x5c
\
U+ff3c
\
U+005c
0x5d
]
U+ff3d
]
U+005d
0x5e
^
U+ff3e
^
U+005e
0x5f
_
U+ff3f
_
U+005f
0x60
'
U+ff40
`
U+0060
0x61
a
U+ff41
a
U+0061
0x62
b
U+ff42
b
U+0062
0x63
c
U+ff43
c
U+0063
0x64
d
U+ff44
d
U+0064
0x65
e
U+ff45
e
U+0065
0x66
f
U+ff46
f
U+0066
0x67
g
U+ff47
g
U+0067
0x68
h
U+ff48
h
U+0068
0x69
i
U+ff49
i
U+0069
0x6a
j
U+ff4a
j
U+006a
0x6b
k
U+ff4b
k
U+006b
0x6c
l
U+ff4c
l
U+006c
0x6d
m
U+ff4d
m
U+006d
0x6e
n
U+ff4e
n
U+006e
0x6f
o
U+ff4f
o
U+006f
0x70
p
U+ff50
p
U+0070
0x71
q
U+ff51
q
U+0071
0x72
r
U+ff52
r
U+0072
0x73
s
U+ff53
s
U+0073
0x74
t
U+ff54
t
U+0074
0x75
u
U+ff55
u
U+0075
0x76
v
U+ff56
v
U+0076
0x77
w
U+ff57
w
U+0077
0x78
x
U+ff58
x
U+0078
0x79
y
U+ff59
y
U+0079
0x7a
z
U+ff5a
z
U+007a
0x7b
{
U+ff5b
{
U+007b
0x7c
|
U+ff5c
|
U+007c
0x7d
}
U+ff5d
}
U+007d
0x7e
U+ff5e
~
U+007e

 

JAVA實現全形和半形的轉換

package com.demo;
public class DBCDemo {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String input = "test001!你好";
//        input = fullToHalf(input);
        input = halfToFull(input);
        System.out.println(input);
        //全形和半形的空格的Unicode值相差12256
        System.out.println('\u3000'-'\u0020');
        //除空格外的全形和半形的Unicode值相差65248,以!字元為例
        System.out.println('\uff01'-'\u0021');
    }

    /**
     * 全形轉半形
     * 
     * @param input
     * @return output
     */
    public static String fullToHalf(String input) {
        if (null == input || "".equals(input.trim())) {
            return null;
        }
        char[] array = input.toCharArray();
        for (int i = 0; i < array.length; i++) {
            // 全形空格轉換為半形空格
            if (array[i] == '\u3000') {
                array[i] = '\u0020';
            // 除空格外的其他字元轉換
            } else if (array[i] > '\uff00' && array[i] < '\uff5f') {
            //65248是全形和半形的Unicode值相差
                array[i] = (char) (array[i] - 65248);
            }
        }
        String output = new String(array);
        return output;
    }
    /**
     * 半形轉換為全形
     * @param input
     * @return output
     */
    public static String halfToFull(String input) {
        if (null == input || "".equals(input.trim())) {
            return null;
        }
        char[] array = input.toCharArray();
        for (int i = 0; i < array.length; i++) {
            //半形空格轉換為全形空格
            if (array[i] == '\u0020') {
                array[i] = '\u3000';
            //除空格外的半形字元轉換為全形字元
            } else if (array[i] > '\u0020' && array[i] < '\u007f') {
                array[i] = (char) (array[i] + 65248);
            }
        }
        String output = new String(array);
        return output;
    }
}
View Code

 

 參考文獻:

百度百科:全形http://baike.baidu.com/link?url=WHCrFZtbZb1_y6jv7CKsX1MB-mjInmL6XQ4yq26JD57tR3TrHK7jnhZrlMmsesLEfDYijTF4dsX8kFMx76cqNa

 






 

 

 

 

相關文章