半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。
一、概念
全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理
二、实现思路
1. 找到目标unicode的字符,可以使用正则表达式解决
2. 修改unicode编码
三、实现
1. 首先是两个unicode与字符的转换函数:
/**
* 将unicode转换成字符
* @param int $unicode
* @return string UTF-8字符
**/
function unicode2Char($unicode){
if($unicode < 128) return chr($unicode);
if($unicode < 2048) return chr(($unicode >> 6) + 192) .
chr(($unicode & 63) + 128);
if($unicode < 65536) return chr(($unicode >> 12) + 224) .
chr((($unicode >> 6) & 63) + 128) .
chr(($unicode & 63) + 128);
if($unicode < 2097152) return chr(($unicode >> 18) + 240) .
chr((($unicode >> 12) & 63) + 128) .
chr((($unicode >> 6) & 63) + 128) .
chr(($unicode & 63) + 128);
return false;
}
/**
* 将字符转换成unicode
* @param string $char 必须是UTF-8字符
* @return int
**/
function char2Unicode($char){
switch (strlen($char)){
case 1 : return ord($char);
case 2 : return (ord($char{1}) & 63) |
((ord($char{0}) & 31) << 6);
case 3 : return (ord($char{2}) & 63) |
((ord($char{1}) & 63) << 6) |
((ord($char{0}) & 15) << 12);
case 4 : return (ord($char{3}) & 63) |
((ord($char{2}) & 63) << 6) |
((ord($char{1}) & 63) << 12) |
((ord($char{0}) & 7) << 18);
default :
trigger_error('Character is not UTF-8!', E_USER_WARNING);
return false;
}
}
2. 全角转半角
/**
* 全角转半角
* @param string $str
* @return string
**/
function sbc2Dbc($str){
return preg_replace(
// 全角字符
'/[\x{3000}\x{ff01}-\x{ff5f}]/ue',
// 编码转换
// 0x3000是空格,特殊处理,其他全角字符编码-0xfee0即可以转为半角
'($unicode=char2Unicode(\'\0\')) == 0x3000 ? " " : (($code=$unicode-0xfee0) > 256 ? unicode2Char($code) : chr($code))',
$str
);
}
3. 半角转全角
/**
* 半角转全角
* @param string $str
* @return string
**/
function dbc2Sbc($str){
return preg_replace(
// 半角字符
'/[\x{0020}\x{0020}-\x{7e}]/ue',
// 编码转换
// 0x0020是空格,特殊处理,其他半角字符编码+0xfee0即可以转为全角
'($unicode=char2Unicode(\'\0\')) == 0x0020 ? unicode2Char(0x3000) : (($code=$unicode+0xfee0) > 256 ? unicode2Char($code) : chr($code))',
$str
);
}
四、测试
示例代码:
$a = 'abc12 345';
$sbc = dbc2Sbc($a);
$dbc = sbc2Dbc($sbc);
var_dump($a, $sbc, $dbc);
结果:
string(9) "abc12 345"
string(27) "abc12 345"
string(9) "abc12 345"
C#全角半角转换函数
Code#region 全角半角转换 /// /// 转全角的函数(SBC case) /// ///
C#全角半角转换输出解决方法
Microsoft.VisualBasic 命名空间 Strings 模块 StrConv 函数就具有大写/小写.全角/半角.中文简体/繁体等转换功能,字符串转换应该说是VB.NET的强项,是这样的: ...
SQL 全角半角转换-(摘抄)
/****** SQL转换全角/半角函数 开始******/ CREATE FUNCTION ConvertWordAngle ( @str NVARCHAR(4000), --要转换的字符串 @fl ...
php 全角半角转换
java 全角半角转换函数
/** * 半角转全角 * @param input String. * @return 全角字符串. */ public static String ToSBC(String input) { ch ...
【python】 全角半角转换
以输入为GB18030编码字符串为例: #把全角字符串转半角 def tobanjiao(string): ustring = string.decode('GB18030') rstring = & ...
PHP全角半角转换函数
之前试过网上找的通过ASCII之类的字符替换,发现很多莫名其妙的问题.最后还是换成下面的字符替换方式了,把目前能找到的所有全角都列出来了一个个替换吧 /** * 全角字符转换为半角 * * @para ...
提供对字符串的全角->;半角,半角->;全角转换
package com.opslab.util.algorithmImpl; import com.opslab.util.StringUtil; /** * 提供对字符串的全角->半角,半角- ...
Java如何判断字符串中包含有全角,半角符号
首先介绍下全角跟半角之间的区别: 在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角" ...
随机推荐
【iCore3 双核心板】例程二十二:LAN_UDP实验——以太网数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1kTPlJMJ iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
上次遗留下来的XMLUtil的问题
·在上周留下了一个关于XMLUtil的问题,问题大概是这样的,需要通过读取一个XML文件,然后在内存中生成一个对应的javaBean.之前写的那个很是糟糕,照着一个XML去写了一个"Util ...
js Dom树结构分析
对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的)
AVFoundation--视频录制
// // ViewController.m // AVFoundationCameraRecording // // Created by ZhuYi on 16/5/3. // Copyright ...
hdu_5104 Primes Problem()
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5104 rimes Problem Time Limit: 2000/1000 MS (Java/Oth ...
为 Debian 8 或 Debian 9(64 位)安装 .NET Core
在 Debian 8 或 Debian 9(64 位)上安装 .NET Core 的具体步骤: 备注:必须有用户控制目录,才能通过 tar.gz 在 Linux 系统上进行安装. 1.准备一台刚安装的 ...
NRF51822模块无法识别问题解决办法
我知道没图是没人看的,所以随便瞎截图了几张. 对于很多新手朋友们,或许可能还不是很了解jtag相关的一些调试所需的必须电路,就像很多人不喜欢用stm32的硬件i2c,而是喜欢软件io模拟,就算是使用了 ...
rand和srand的用法
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include
.Net NPOI 上传excel文件、提交后台获取excel里的数据
1.导入NPOI.dll 2.添加类NPOIExcel.cs using System; using System.Collections.Generic; using System.Text; us ...
新系统centos7重启网络报错
场景: 在不知名云上新弄的centos7,改了IP之后启动不起来,使用systemctl status network查看结果如下: 排查过程: 1)NetworkManager是否关 ...