詳解全角和半角的轉換


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

  所以本人就對全角和半角進行了一些分析和總結以及它們之間用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

 






 

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM