C# 实现全角与半角字符串的转换及判断
在处理中文文本或用户输入时,经常需要区分和处理全角与半角字符。本文将展示如何利用 C# 的 System.Text.Encoding 进行判断,并通过 Unicode 码值规律编写完整的转换函数。
判断全角与半角状态
全角字符占用两个字节,半角字符占用一个字节。我们可以通过对比字符串的字符数量(Length)与字节数组长度来进行判断。
第1步:判断是否为半角
原理:若字符串所有字符均为半角,则字符数等于字节数。
第2步:判断是否为全角
原理:若字符串包含全角字符且无半角混合干扰(严格来说此逻辑适用于纯全角检测),则字节数约为字符数的两倍。
注意:此方法更适合检测“是否全部为半角”或粗略估计全角占比,精确到每个字符需逐字判断。
第3步:执行代码验证
以下为判断逻辑的核心代码片段:
// 引入命名空间
using System;
using System.Text;
public bool IsHalfWidth(string checkString) {
// 如果字符数 == 字节数,说明全是半角
if (checkString.Length == Encoding.Default.GetByteCount(checkString)) {
return true;
}
return false;
}
public bool IsFullWidth(string checkString) {
// 如果是纯全角字符串,字节数通常是字符数的2倍
// 注意:此判断假设字符串不包含半角字符混合
if (2 * checkString.Length == Encoding.Default.GetByteCount(checkString)) {
return true;
}
return false;
}
全角与半角相互转换
全角与半角字符在 Unicode 编码中有固定的偏移量关系:
- 全角空格:12288,半角空格:32
- 其他可见字符:全角与半角的差值固定为 65248
第4步:半角转全角 (ToSBC)
目的:将常见的 ASCII 字符转换为对应的全角形式。
public static string ToSBC(string input) {
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++) {
if (c[i] == 32) { // 处理半角空格
c[i] = (char)12288;
continue;
}
if (c[i] < 127) { // 半角字符范围 33-126
c[i] = (char)(c[i] + 65248);
}
}
return new string(c);
}
第5步:全角转半角 (ToDBC)
目的:将全角字符还原为标准 ASCII 格式。
public static string ToDBC(string input) {
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++) {
if (c[i] == 12288) { // 处理全角空格
c[i] = (char)32;
continue;
}
if (c[i] > 65280 && c[i] < 65375) { // 全角字符范围 65281-65374
c[i] = (char)(c[i] - 65248);
}
}
return new string(c);
}
注意事项与排错
- 编码依赖:判断字节数时使用
Encoding.Default依赖于系统默认编码(通常为 GBK/GB2312 对于中文 Windows)。若在 Linux/macOS 或 UTF-8 环境下,建议明确使用Encoding.UTF8并进行相应逻辑调整,因为 UTF-8 中汉字占3字节。 - 特殊符号:上述转换仅覆盖常见标点与字母数字。部分生僻符号或非标准全角字符可能需要扩展判断区间。
- 性能优化:对于海量数据,避免频繁创建
char[]副本,可考虑使用Span<char>或内存池技术,但常规业务场景中以上代码已足够高效。
以上就是 C# 实现全角与半角转换及判断的详细内容,更多关于 C# 字符串处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













