1. 程式人生 > >lua 含中文的字串處理--分離字元、計算字元數、擷取指定長度

lua 含中文的字串處理--分離字元、計算字元數、擷取指定長度

lua中對中文字串的一些處理

分離字元

將每個字元分離出來,放到table中,一個單元內一個字元

function StringToTable(s)
    local tb = {}
    
    --[[
    UTF8的編碼規則:
    1. 字元的第一個位元組範圍: 0x00—0x7F(0-127),或者 0xC2—0xF4(194-244); UTF8 是相容 ascii 的,所以 0~127 就和 ascii 完全一致
    2. 0xC0, 0xC1,0xF5—0xFF(192, 193 和 245-255)不會出現在UTF8編碼中 
    3. 0x80—0xBF(128-191)只會出現在第二個及隨後的編碼中(針對多位元組編碼,如漢字) 
    ]]
    for utfChar in string.gmatch(s, "[%z\1-\127\194-\244][\128-\191]*") do
        table.insert(tb, utfChar)
    end
    
    return tb
end

計算字元數

獲取字串長度,設一箇中文長度為2,其他長度為1

function GetUTFLen(s)
    local sTable = StringToTable(s)

    local len = 0
    local charLen = 0

    for i=1,#sTable do
        local utfCharLen = string.len(sTable[i])
        if utfCharLen > 1 then -- 長度大於1的就認為是中文
            charLen = 2
        else
            charLen = 1
        end

        len = len + charLen
    end

    return len
end


獲取指定字元個數的字串的實際長度,設一箇中文長度為2,其他長度為1,count:-1表示不限制
function GetUTFLenWithCount(s, count)
    local sTable = StringToTable(s)

    local len = 0
    local charLen = 0
    local isLimited = (count >= 0)

    for i=1,#sTable do
        local utfCharLen = string.len(sTable[i])
        if utfCharLen > 1 then -- 長度大於1的就認為是中文
            charLen = 2
        else
            charLen = 1
        end

        len = len + utfCharLen

        if isLimited then
            count = count - charLen
            if count <= 0 then
                break
            end
        end
    end

    return len
end


擷取指定長度

擷取指定字元個數的字串,超過指定個數的,擷取,然後新增...

function GetMaxLenString(s, maxLen)
    local len = GetUTFLen(s)
    
    local dstString = s
    -- 超長,裁剪,加...
    if len > maxLen then
        dstString = string.sub(s, 1, GetUTFLenWithCount(s, maxLen))
        dstString = dstString.."..."
    end

    return dstString
end


之所以上面所有的都是設一箇中文長度為2,其他長度為1,是因為需要將文字顯示在指定寬度的區域內,而顯示時,一箇中文的寬度約等於2個其他字元的寬度,所以做上述設定。

如果要1箇中文字元長度為1,只需要修改

charLen = 1

即可。

相關推薦

lua 中文字串處理--分離字元計算字元擷取指定長度

lua中對中文字串的一些處理 分離字元 將每個字元分離出來,放到table中,一個單元內一個字元 function StringToTable(s) local tb = {} --[[ UTF8的編碼規則: 1. 字元的第一個

Lua中文字串長度計算

轉自:http://m.blog.csdn.net/DanceWithCode1990/article/details/51154681 在專案中遇到了需要在Lua中計算含中文的字串的字串長度。 當時想當然的就用了string.len(“確定”) 發現輸出時竟然是6!後來才知道 ,由於檔案編

Python爬蟲中文小說網點查找小說並且保存到txt(中文亂碼處理方法)

nbsp nor png erro 請求方式 輸出結果 下載 ros mozilla 從某些網站看小說的時候經常出現垃圾廣告,一氣之下寫個爬蟲,把小說鏈接抓取下來保存到txt,用requests_html全部搞定,代碼簡單,容易上手. 中間遇到最大的問題就是編碼問題,第一抓

python下中文字串正則表示式的編碼問題

前言Python檔案預設的編碼格式是ascii ,無法識別漢字,因為ascii碼中沒有中文。所以py檔案中要寫中文字元時,一般在開頭加 # -*- coding: utf-8 -*- 或者 #coding=utf-8。這是指定一種編碼格式,意味著用該編碼儲存中文字元(也可以是

中文字串處理

1. 擷取GB2312中文字串 <?php < ?php //擷取中文字串 function mysubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $len; f

字串處理函式】遇到某個字元就使用另外兩個字元替換

//遇到換行符就用"!,"替換的字串處理函式 static void str_handle_replace_with_twochar(char* buf, char* buf_temp) { //計

連結串列實現學生資訊表(輸入輸出計算表長查詢插入刪除等功能)

連結串列實現學生資訊表(含輸入、輸出、計算表長、查詢、插入、刪除等功能) #include <stdio.h> #include <stdlib.h> void menu() { printf("make your choice \n"); pr

javaSE (二十六)map集合遍歷(兩種方法)輸入字元計算字元出現次數(用map實現)HashMap巢狀HashMap

1、map集合遍歷: map集合沒有iterator方法,所以不能直接迭代 直接看下面的程式碼和第一行的註解(加了註釋之後變黑看不清了,所以前面沒加註釋) 1、map的第一種遍歷:遍歷map的所有值:method1() 獲取所有的鍵的集合:Set<K> keySet()

SQL必知必會 -------- 通配符計算字段

提取 mar 第8章 column round vendor 方法 多少 頁面 1.LIKE操作符 1.1百分號(%)通配符 SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%‘

實例對象構造函原型之間的關系

http 實例化 call 並且 mic ima 自己的 function 瀏覽器 實例對象、構造函數和原型之間的關系 實例對象 實例對象中只有__proto__屬性,所有的實例都指向自己構造函數的原型。__proto__屬性裏面有構造器constructi

PHP.25-TP框架商城應用實例-後臺1-添加商品功能鉤子函在線編輯器過濾XSS上傳圖片並生成縮略圖

引用傳遞 none move 名稱 textarea 如果 library time fields 添加商品功能   1、創建商品控制器【C】  /www.test.com/shop/Admin/Controller/GoodsController.class.php

【函】02匿名函生成器高階函

lambda一、匿名函數1、定義語法格式: lambda args:expression args:以逗號分隔的參數列表 expression:用到args中各參數的表達式 lambda定義的代碼必須是合法的表達式,不能出現多條件語句(可使用if的三元表達式)和非表達式,如f

python基礎之內置函補充匿名函遞歸函

round if判斷 就會 ssi 如果 生成 code hello 定義 內置函數補充 python divmod()函數:把除數和余數運算結果結合起來,返回一個包含商和余數的元組(a // b, a % b) 語法: 1 divmod(a, b)  #a、b為數字,a

可選參命名參.NET的特殊類型特性

應用 傳輸 問題 運行 read company ria 隱式類型 dynamic 1、可選參數和命名參數 1.1可選參數 語法: [修飾符] 返回類型 方法名(必選參數n,可選參數n) 註意:

關於對象構造函原型原型鏈繼承

mes 創建對象 light 表示 {} highlight col 面向 原型鏈 對象: 在傳統的面向過程的程序設計中,會造成函數或變量的冗余。而js中對象的目的是將所有的具有相同屬性或行為的代碼整合到一起,形成一個集合,這樣就會方便管理,例如: var person

C語言中 有符號無符號整數溢出 (轉)

alt 原因 () tar sig 重新 detail copyto 想象 [cpp] view plain copy print? #include<stdio.h> void main() { int l=-1; unsigned

python函中的位置參默認參關鍵字參可變參區別

pytho http cti 發現 位置 key strong 收集 python 一、位置參數 調用函數時根據函數定義的參數位置來傳遞參數。 #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex)

JS高級. 02 面向對象創建對象構造函自定義構造函原型

浪費 truct 創建過程 spa const 使用 指向 找到 tro 面向對象的三大特性:    封裝     a) 把一些屬性和方法裝到一個對象裏   2. 繼承     a) js中的繼承是指:    一個對象沒有一些方法和屬性,而另一個對象有

布爾類型操作符別名C++函動態內存分配(newdelete)引用(day02)

color 返回 void double 強制 也會 了解 關系 指針 六 C++的布爾類型 1 bool類型是C++中基本類型,專門表示邏輯值:true/false 2 bool在內存上占一個字節:1表示true,0表示false 3 bool類型可以接收任意類型和表達

dup文件鎖庫函調用(day07)

start 記錄 變參 new type hold tin 功能 返回值 一、lseek(2)重新定位文件的讀寫位置。 #include <sys/types.h> #include <unistd.h> off_t lseek(int fd,