全角字符转半角字符(java & JavaScript)

全角转半角实现
本文提供了Java和JavaScript两种语言的实现方式,用于将输入的全角字符转换为对应的半角字符。通过遍历字符串中的每个字符并检查其Unicode值,可以有效地进行全角到半角的转换。
Java版本:


/**
* @param str 目标字符串
* @return 将全角字符全部转换为半角的字符串
*/
public static String toDBC(String str) {
if (str == null || str.length() == 0) {
return str;
}
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = charToDBC(chars[i]);
}
return new String(chars);
}
protected static char charToDBC(char ch) {
if (ch == '\u3000') {
return '\u0020';// 半角空格:
} else if (ch > '\uFF00' && ch < '\uFF5F') {
return (char) (ch - 65248);
}
return ch;
}


JavaScript版本:


/**
*
* @param {String}
* str 字符串
* @return {String} 将全角全部转换为半角的字符串
*/
function toDBC(str){
if (str) {
var result = "";
var code = 0;
for (var i = 0; i < str.length; i++) {
code = str.charCodeAt(i);
if (code == 12288) {
result += String.fromCharCode(32);
} else if (code > 65280 && code < 65375) {
result += String.fromCharCode(code - 65248);
} else {
result += str.charAt(i);
}
}
return result;
}
return str;
}
&lt;think&gt;根据用户需求,需要将字符串中的全角字符转换为半角字符。参考提供的引用内容,特别是引用[2]中Python实现方法,以及引用[3]中提到Java使用ICU库的方法。全角字符与半角字符的转换规则:1.全角空格(Unicode12288)转换为半角空格(32)2.全角字符(除空格)在Unicode中范围为65281到65374,转换为半角字符只需减去65248(因为半角字符对应的Unicode码值比全角小65248)3.其他字符保持不变我们将提供几种常见编程语言的实现。首先,Python实现(参考引用[2]并修正注释):```pythondeffull_to_half(text:str)-&gt;str:&quot;&quot;&quot;将字符串中的全角字符转换为半角字符&quot;&quot;&quot;result=[]forcharintext:inside_code=ord(char)ifinside_code==12288:#全角空格result.append(chr(32))elif65281&lt;=inside_code&lt;=65374:#全角字符(除空格)result.append(chr(inside_code-65248))else:result.append(char)return&#39;&#39;.join(result)```其次,Java实现(参考引用[3]使用ICU库,但也可以自己实现转换):如果项目允许使用第三方库,推荐使用ICU4J,因为日语等字符转换更复杂。但若仅是中英文全半角转换,可自行实现。自行实现的Java版本:```javapublicstaticStringfullToHalf(Stringtext){StringBuildersb=newStringBuilder(text.length());for(inti=0;i&lt; text.length();i++){charc=text.charAt(i);intcode=(int)c;if(code==12288){//全角空格sb.append((char)32);}elseif(code&gt;=65281&amp;&amp;code&lt;=65374){sb.append((char)(code-65248));}else{sb.append(c);}}returnsb.toString();}```使用ICU4J的Java版本(需要添加依赖):```javaimportcom.ibm.icu.text.Transliterator;publicclassHalfWidthConverter{publicstaticStringfullToHalf(Stringtext){//创建转换规则,将全角字符转换为半角Transliteratortransliterator=Transliterator.getInstance(&quot;Fullwidth-Halfwidth&quot;);returntransliterator.transliterate(text);}}```接下来是JavaScript实现:```javascriptfunctionfullToHalf(text){letresult=&#39;&#39;;for(leti=0;i&lt; text.length;i++){constcharCode=text.charCodeAt(i);if(charCode===12288){result+=String.fromCharCode(32);//全角空格转半角空格}elseif(charCode&gt;=65281&amp;&amp;charCode&lt;=65374){result+=String.fromCharCode(charCode-65248);}else{result+=text[i];}}returnresult;}```最后是PHP实现:```phpfunctionfull_to_half($text){$len=mb_strlen($text,&#39;UTF-8&#39;);$result=&#39;&#39;;for($i=0;$i&lt; $len;$i++){$char=mb_substr($text,$i,1,&#39;UTF-8&#39;);$code=mb_ord($char);//需要自定义mb_ord函数,因为PHP没有内置函数直接获取Unicode码点if($code===12288){$result.=chr(32);}elseif($code&gt;=65281&amp;&amp;$code&lt;=65374){$result.=chr($code-65248);}else{$result.=$char;}}return$result;}//自定义函数:获取UTF-8字符的Unicode码点if(!function_exists(&#39;mb_ord&#39;)){functionmb_ord($char){$k=mb_convert_encoding($char,&#39;UCS-2LE&#39;,&#39;UTF-8&#39;);$k1=ord(substr($k,0,1));$k2=ord(substr($k,1,1));return$k2*256+$k1;}}```注意:PHP版本中,我们自定义了`mb_ord`函数来获取UTF-8字符的Unicode码点,因为PHP没有内置的函数。这里转换方法是将字符转换为UCS-2LE编码然后计算码点,但要注意这种方法只能处理BMP平面内的字符(基本多语言平面)。对于辅助平面的字符(如emoji)可能会出错。不过全角字符都在BMP平面内,所以对于全角转半角是安全的。以上各语言实现均遵循了全角转半角的基本规则。对于其他语言(如C++等)也可以类似实现。另外,要注意:转换函数对数字、字母、标点符号有效,对于其他全角字符(如日文、韩文等)可能不在这个范围内,需要根据具体需求扩展规则。最后,生成相关问题:&sect;&sect;相关问题&sect;&sect;1.如何实现半角字符全角字符的转换?2.转换全角字符时如何处理特殊语言的全角字符(如日文)?3.在转换过程中如何保留原始格式(如换行符)?4.全半角转换在文本规范化中还有哪些应用?5.如何在数据库中批量更新全角字符为半角字符&lt;/think&gt; ### 全角字符转半角字符的实现方案 全角字符(如中文标点、字母和数字)占两个字节宽度,半角字符为单字节宽度。转换核心原理是根据 Unicode 编码规则进行映射[^1][^2]。 #### Python 实现 ```python def full_to_half(text: str) -&gt; str: &quot;&quot;&quot;全角转半角(支持中英文及符号)&quot;&quot;&quot; result = [] for char in text: code = ord(char) if code == 12288: # 全角空格 result.append(chr(32)) elif 65281 &lt;= code &lt;= 65374: # 全角字符范围 result.append(chr(code - 65248)) else: result.append(char) return &#39;&#39;.join(result) # 示例 original = &quot;&ldquo;ABC123&rdquo;(全角)&quot; converted = full_to_half(original) # 输出:&quot;\&quot;ABC123\&quot;(半角)&quot; ``` &gt; 实现原理:全角字符的 Unicode 编码比半角字符大65248[^2] #### Java 实现 (ICU4J 库) ```java import com.ibm.icu.text.Transliterator; String halfWidthToFullWidth(String text) { Transliterator transliterator = Transliterator.getInstance(&quot;Fullwidth-Halfwidth&quot;); return transliterator.transliterate(text); } ``` &gt; ICU4J 提供专业的多语言转换支持,特别适合处理日韩文字混排场景[^3] #### JavaScript 实现 ```javascript function fullToHalf(str) { return str.replace(/[\uFF01-\uFF5E]/g, char =&gt; String.fromCharCode(char.charCodeAt(0) - 65248) ).replace(/\u3000/g, &#39;\u0020&#39;); // 处理空格 } ``` #### 转换规则详解 | 字符类型 | 全角范围 | 半角范围 | 差值 | |----------------|--------------|--------------|-------| | 数字/字母 | FF01-FF5E | 21-7E | 65248 | | 空格 | 3000 | 20 | - | | 中文标点 | 特殊处理 | 保留原样 | - |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值