详解全角和半角的转换

   最近在项目中遇到一个问题,客户上传的文件无法下载下来,经过定位发现原来客户上传的文件名中包含很多全角字符导致无法解析,找不到对应的文件,其实文件是真实存在的,只是用的上传下载组件不支持全角字符的文件名,从而导致文件找到不到,无法下载。

  所以本人就对全角和半角进行了一些分析和总结以及它们之间用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

 






 

 

 

 


posted @ 2015-02-08 00:26 阿赫瓦里 阅读(...) 评论(...) 编辑 收藏