首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Flex 正則表達式判斷中文全角字符並計算顯示寬度

     編輯:更多程式設計知識

Flex 中 String.length 返回字符數(Code Units),非顯示寬度。中文、全角字符佔 2 個顯示單元,英文、半角佔 1。本文提供基於正則的字符分類與顯示寬度計算實現。

核心邏輯:正則匹配非 ASCII 字符


public function getDisplayLength(str:String):int {
    var length:int = 0;
    for (var i:int = 0; i < str.length; i++) {
        var char:String = str.charAt(i);
        // 正則:匹配非基本拉丁字符(即全角/中文/日文/韓文等)
        if (/[^\x00-\xFF]/.test(char)) {
            length += 2;  // 全角字符寬度 2
        } else {
            length += 1;  // 半角字符寬度 1
        }
    }
    return length;
}

正則表達式解析

優化版:預編譯正則 + 批量處理


public class StringWidthUtils {
    private static const FULLWIDTH_REGEX:RegExp = /[^\x00-\xFF]/;
    
    // 單字符串計算
    public static function getDisplayLength(str:String):int {
        if (!str) return 0;
        var len:int = 0;
        for (var i:int = 0; i < str.length; i++) {
            len += FULLWIDTH_REGEX.test(str.charAt(i)) ? 2 : 1;
        }
        return len;
    }
    
    // 批量計算(避免重複創建 RegExp 實例)
    public static function getDisplayLengths(strings:Vector.<String>):Vector.<int> {
        var result:Vector.<int> = new Vector.<int>(strings.length, true);
        for (var i:int = 0; i < strings.length; i++) {
            result[i] = getDisplayLength(strings[i]);
        }
        return result;
    }
    
    // 截取指定顯示寬度
    public static function substrByDisplayWidth(str:String, maxWidth:int):String {
        if (!str || maxWidth <= 0) return "";
        var currentWidth:int = 0;
        var lastValidPos:int = 0;
        for (var i:int = 0; i < str.length; i++) {
            var char:String = str.charAt(i);
            var charWidth:int = FULLWIDTH_REGEX.test(char) ? 2 : 1;
            if (currentWidth + charWidth > maxWidth) break;
            currentWidth += charWidth;
            lastValidPos = i + 1;
        }
        return str.substr(0, lastValidPos);
    }
}

使用示例


var testStr:String = "Hello世界!";
trace(StringWidthUtils.getDisplayLength(testStr));  // 11 (5*1 + 2*2 + 1*2)

// 表單驗證:限制顯示寬度 20
var input:String = textInput.text;
if (StringWidthUtils.getDisplayLength(input) > 20) {
    Alert.show("輸入內容超過顯示寬度限制(20)");
    textInput.text = StringWidthUtils.substrByDisplayWidth(input, 20);
}

陷阱與避坑

模式含義匹配示例
[^\x00-\xFF]非 0x00-0xFF 範圍字符(超出 Latin-1)中文、日文、全角標點、Emoji
[\u4e00-\u9fa5]CJK 統一表意文字基本區塊常用漢字
[\uFF00-\uFFEF]半角/全角形式區塊全角字母、數字、符號
[\u3000-\u303F]CJK 符號和標點全角空格、句號、括號
問題原因解決
Emoji 計算錯誤Emoji 為代理對,charAt 只取高位用 String.fromCharCode 處理補充平面字符,或接受近似值
字體渲染差異等寬字體下全角=2半角,比例字體視覺寬度不同僅用於邏輯限制(如數據庫字段寬度),UI 對齊用 monospace 字體
性能問題長文本逐字符正則測試慢預編譯 RegExp、使用 String.charCodeAt 數值比較更快

極速版:字符碼位數值判斷(無正則開銷)


public static function getDisplayLengthFast(str:String):int {
    var len:int = 0;
    for (var i:int = 0; i < str.length; i++) {
        var code:uint = str.charCodeAt(i);
        // 基本多文種平面 (BMP) 內:ASCII 0-127 為半角,其餘視為全角
        // 補充平面字符 (code > 0xFFFF) 由 charCodeAt 返回高代理項,同樣按全角處理
        len += (code <= 0x7F) ? 1 : 2;
    }
    return len;
}

性能提升:數值比較比正則匹配快 10-50 倍,適合高頻調用場景(如實時輸入檢查)。

總結

Flex 計算顯示寬度核心在於區分 ASCII (0-127) 與非 ASCII 字符。正則 /[^\x00-\xFF]/ 語義清晰,數值判斷 code <= 0x7F 性能極優。封裝為工具類提供 getDisplayLength、substrByDisplayWidth 等通用方法,滿足表單驗證、列表截斷、報表對齊等實際需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved