详解全角和半角的转换

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

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

参考文献:

百度百科:全角http://baike.baidu.com/link?url=WHCrFZtbZb1_y6jv7CKsX1MB-mjInmL6XQ4yq26JD57tR3TrHK7jnhZrlMmsesLEfDYijTF4dsX8kFMx76cqNa

				
时间: 2024-12-25 13:28:25

详解全角和半角的转换的相关文章

java 全角、半角字符串转换

转自:http://www.cnblogs.com/modou/articles/2679815.html     加入了空字符串的验证 半角转全角的方法: /** * @Title: ToSBC * @Description: 半角转全角 * @param input String. * @return 全角字符串. * @throws */ public static String ToSBC(String input) { if(!("".equals(input)||input

java 全角字符半角字符转换

[java] view plaincopy /// <summary> /// 判断字符是否英文半角字符或标点 /// </summary> /// <remarks> /// 32    空格 /// 33-47    标点 /// 48-57    0~9 /// 58-64    标点 /// 65-90    A~Z /// 91-96    标点 /// 97-122    a~z /// 123-126  标点 /// </remarks> pu

sql server 2005全角与半角字符转换

CREATE FUNCTION D_ByteExchangeS_Byte(@str NVARCHAR(4000), --要转换的字符串@flag bit              --转换标志,0转换成半角,1转换成全角)RETURNS nvarchar(4000)ASBEGIN    DECLARE @pat nvarchar(8),@step int,@i int,@spc int    IF @flag=0        SELECT @pat=N'%[!--]%',@step=-6524

java全角和半角转换

package test; public class HalfAndFullConverseUtil { /** * ASCII表中可见字符从!开始,偏移位值为33(Decimal) */ private static final char DBC_CHAR_START = 33; // 半角! /** * ASCII表中可见字符到~结束,偏移位值为126(Decimal) */ private static final char DBC_CHAR_END = 126; // 半角~ /** *

SQL转换全角和半角函数

SQL转换全角和半角函数 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8),@step int,@i int,@spc int IF @flag=0 SELECT @pat=N'%[!--]%',@step=-65248, @str=REPLACE(@st

java全角、半角字符的关系以及转换

如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对应编码的值\ public static void main(String[] args) { for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) { System.out.println(i + " "

C#全角和半角转换

在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角".在汉字输入时,系统提供"半角"和"全角"两种不同的输入状态,但是对于英文字母.符号和数字这些通用字符就不同于汉字,在半角状态它们被作为英文字符处理:而在全角状态,它们又可作为中文字符处理.半角和全角切换方法:单击输入法工具条上的 按钮或按键盘上的Shift+Space键来切换. (1)全角--指一个

字符串 批量全角、半角转换

全角转为半角 ADDRESS=KTRANSLATE(ADDRESS,'1234567890()','1234567890()'); ADDRESS=KTRANSLATE(ADDRESS,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','ABCDEFGHIJKLMNOPQRSTUVWXYZ'); 另一种方法:TRANWRD(ADDRESS,'?','?');

MySQL 全角转换为半角

?序言:       用户注册时候,录入了全角手机号码,所以导致短信系统根据手机字段发送短信失败,现在问题来了,如何把全角手机号码变成半角手机号码? 1,手机号码全角转换成半角先查询出来全角半角都存在的手机号码的数据SELECT a.username ,COUNT(1) AS numFROM(SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(uu.user_name,'0'