在 .NET 中判斷字串是否包含中文(或廣義的非 ASCII 字元),常見誤區是直接檢查 Unicode 位元組是否為 0。本文分析原始碼片段的邏輯缺陷,並提供更正確、高效的實作方案。
public bool CheckChinese(string str)
{
bool flag = false;
UnicodeEncoding a = new UnicodeEncoding();
byte[] b = a.GetBytes(str);
for (int i = 0; i < b.Length; i++)
{
i++; // 每次迴圈額外遞增,導致跳過位元組
if (b[i] != 0) { flag = true; }
else { flag = false; }
}
return flag;
}
using System.Text.RegularExpressions;
public bool ContainsChinese(string input)
{
if (string.IsNullOrEmpty(input)) return false;
// \u4e00-\u9fff 涵蓋 CJK 統一表意文字基本區塊
return Regex.IsMatch(input, @"[\u4e00-\u9fff]");
}
擴充範圍**(含擴展區塊 A/B、相容字元):
// 更完整的中日韓文字範圍
var pattern = @"[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\U00020000-\U0002a6df\U0002a700-\U0002b73f\U0002b740-\U0002b81f\U0002b820-\U0002ceaf]";
return Regex.IsMatch(input, pattern);
public bool ContainsChinese(string input)
{
if (string.IsNullOrEmpty(input)) return false;
foreach (char c in input)
{
// 基本區塊:CJK Unified Ideographs
if (c >= '\u4e00' && c <= '\u9fff') return true;
// 可視需求加入擴展區塊判斷
}
return false;
}
public bool ContainsNonAscii(string input)
{
return input.Any(c => c > 127); // 超過 ASCII 範圍即視為含非英數字元
}
採用正確方法,能避免誤判日文、韓文、Emoji 等字元為中文,確保業務邏輯準確性。