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

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