详解全角和半角的转换
最近在项目中遇到一个问题,客户上传的文件无法下载下来,经过定位发现原来客户上传的文件名中包含很多全角字符导致无法解析,找不到对应的文件,其实文件是真实存在的,只是用的上传下载组件不支持全角字符的文件名,从而导致文件找到不到,无法下载。
所以本人就对全角和半角进行了一些分析和总结以及它们之间用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; } }
参考文献:
作者:阿赫瓦里
本文以学习、研究和分享为主,版权归作者和博客园共有,欢迎转载,如果文中有不妥或者错误的地方还望大神您不吝指出。如果觉得本文对您有所帮助不如【推荐】一下吧!如果你有更好的建议,不如留言一起讨论,共同进步!