全角和半角转换程序解析

博客探讨了全角和半角字符的概念,包括它们在不同情况下的使用、占用的字节数以及在ASCII和GB2312编码中的差异。通过研究转换程序的函数,发现常量65248的来源与UNICODE编码有关,而非GB2312,澄清了对全角和半角字符编码的误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天看到一个半角和全角转换的程序 ,程序直接贴在下面


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>Quanjiao To Banjiao</title>

<script language="javascript">

/*****************************

*  半角<=>全角 *

* Writer Peng Meizhou *

****************************

*参数说明:

* str:要转换的字符串

* flag:标记,为0时半转全,为非0时全转半

* 返回值类型:字符串

*****************************/

function DBC2SBC(str,flag)

{

	var i;

	var result='';

	if (str.length<=0){

	return false;

	}

	for(i=0;i<str.length;i++)

	{

		str1=str.charCodeAt(i);

		if(!flag)

		{	

			if(str1<127){

				result+=String.fromCharCode(str.charCodeAt(i)+65248);

			}else{

				result+=String.fromCharCode(str.charCodeAt(i));

			}

		}else{

			if(str1>126){

				result+=String.fromCharCode(str.charCodeAt(i)-65248);

			}else{

				result+=String.fromCharCode(str.charCodeAt(i));

			}

		}

	}

	return result;

}

function  QtoB()

{

    var strqb=document.all["qb"].value;

    document.all["qb"].value = DBC2SBC(strqb,1)

}

function  BtoQ()

{

    var strbq=document.all["bq"].value;

    document.all["bq"].value = DBC2SBC(strbq,0)

}

</script>

</head>

<body>

<p>

  <input type="text" name="textfield" id="qb"/>

  <input type="button" name="Button" value="QtoB"  οnclick="QtoB()" />

</p>

<p>

  <input type="text" name="textfield2" id="bq"/>

  <input type="button" name="Button" value="BtoQ" οnclick="BtoQ()" />

</p>

</body>

</html>

 


我比较不理解的是,为什么上面的常量是65248而不是别的,然后我就开始查半角和全角,在百度上得到一个答案

我现在将半角和全角的百度解释粘贴一下


全角/半角字符

A 什么是全角和半角? (1)全角--指一个字符占用两个标准字符位置。 汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。 (2)半角--指一字符占用一个标准的字符位置。 通常的英文字母、数字键、符号键都是半角的,半角的显示内码都是一个字节。在系统内部,以上三种字符是作为基本代码处理的,所以用户输入命令和参数时一般都使用半角。 B 全角与半角各在什么情况下使用? 全角占两个字节,半角占一个字节。 半角全角主要是针对标点符号来说的,全角标点占两个字节,半角占一个字节,而不管是半角还是全角,汉字都还是要占两个字节。 在编程序的源代码中只能使用半角标点(不包括字符串内部的数据) 在不支持汉字等语言的计算机上只能使用半角标点(其实这种情况根本就不存在半角全角的概念) 对于大多数字体来说,全角看起来比半角大,当然这不是本质区别了。 C 全角和半角的区别 全角就是字母和数字等与汉字占等宽位置的字。半角就是ASCII方式的字符,在没有汉字输入法起做用的时候输入的字母数字和字符都是半角的。 在汉字输入法出现的时候,输入的字母数字默认为半角,但是标点则是默认为全角,可以通过鼠标点击输入法工具条上的相应按钮来改变。 D 关于"全角"和"半角": 全角:是指中GB2312-80(《信息交换用汉字编码字符集·基本集》)中的各种符号。 半角:是指英文件ASCII码中的各种符号。


但也就是这个解释搞得我一点都没有头绪,我将GB2312-80这个国家标准都下下来看了,总觉得按照他这个理解半角和全角根据差不了65248的,而是41856(十六进制为A380)。我就琢磨不透了。

又查到另外一个版本的解释:

///全角空格为12288,半角空格为32 ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248

这下子更不知所措了,因为在GB2312码中, 65281-65374根本就是保留的

就在这个时候我想到了,为什么不从转换程序中的函数入手呢。呵呵 这个思路很正确,马上得到证实


JavaScript中fromCharCode和charCodeAt方法



fromCharCode 方法



说明:从一些 Unicode 字符值中返回一个字符串。

示例:

<script language="javascript">document.write("fromCharCode 方法<br>输入一个数字:<input type='text' id='ipt' size='10' value='90'> <input type='button' value='点我一下' οnclick='alert(String.fromCharCode(document.getElementById(/"ipt/").value))'>")</script>







charCodeAt 方法



说明:charCodeAt(index : Number)返回一个整数,该整数表示 String 对象中指定位置处的字符的 Unicode 编码。一个字符串中的第一个字符位于索引位置 0,第二个字符位于索引位置 1,依此类推。如果指定 index 没有字符,将返回 NaN。

示例:

<script language="javascript">document.write("charCodeAt 方法<br>输入一个字符:<input type='text' id='ipt' size='10' value='a'> <input type='button' value='点我一下' οnclick='alert(document.getElementById(/"ipt/").value.charCodeAt(0))'>")</script>


原来这些转换都是以UNICODE编码为基础的,哎 这就好办了

我查找一下在ascii表中!-~的编码是33-126(只所以从!开始,是因为这个第一个可视字符)

我们再找一下在UNICODE编码表中!-~的编码为65296(FF10)-65374(FF5E)

看到了吧,其实上面我查到的关于半角和全角的说法都是有问题的

在GB中和在UNICODE中对于全角字符的编码是不一致的,而给出的函数是针对UNICODE编码的,所以常量为65248

其实我认为半角和全角区别的最权威的说法是全角就是字母和数字等与汉字占等宽位置的字

Del.icio.us : GB2312 半角 全角 编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值