最近在專案中遇到一個問題,客戶上傳的檔案無法下載下來,經過定位發現原來客戶上傳的檔名中包含很多全形字元導致無法解析,找不到對應的檔案,其實檔案是真實存在的,只是用的上傳下載元件不支援全形字元的檔名,從而導致檔案找到不到,無法下載。
所以本人就對全形和半形進行了一些分析和總結以及它們之間用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; } }
參考文獻: