lua 中文字符的判断简介

这篇具有很好参考价值的文章主要介绍了lua 中文字符的判断简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般在工作中会遇到中文字符的判断、截断、打码等需求,之前一直没有总结,虽然网上资料也多,今天在这里简单的总结一下。

1 .UTF-8简单描述

UTF-8 是 Unicode 的实现方式之一,其对应关系(编码规则)如下表所示:

lua 中文字符的判断简介,lua,开发语言

Unicode 可以容纳100多万个符号

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。取值0-127,与标准ASCII 码一一对应。标准ASCII 码表见附录。
  2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。


2 .UTF-8的中文字符编码如何生成

例如 将,两个字从Unicode转换为UTF-8:

  1. 中 : Unicode 是 0x4E2D(0100 1110 0010 1101),根据上表,处于第三行范围内,UTF-8编码需要三个字节,格式为 1110xxxx 10xxxxxx 10xxxxxx
    的Unicode 二进制填充进这个格式,得到 11100100 10111000 10101101,转换为十进制是 228,184,173
    print(string.char(228,184,173)) =>
  2. 龙 : Unicode 是 0x9F99 (1001 1111 1001 1001) ,同样处于第三行范围内。
    UTF-8编码为11101001 10111110 10011001(233,190,153)
    print(string.char(233,190,153)) =>

lua 中文字符的判断简介,lua,开发语言

3. lua判断字符是不是中文

通常来说,汉字范围从0x4E00到0x9FA5,转换为UTF-8编码为11100100 10111000 10000000(228, 184, 128) 到 11101001 10111110 10100101(233, 190, 165)
因此,中文UTF-8编码用3个字节表示,要遵守格式:1110xxxx 10xxxxxx 10xxxxxx
即第一个字节的取值区间为 [11100000, 11110000) = [0xe0, 0xf0) = [224, 240) 左开右闭
后两个字节的取值区间为[10000000, 10111111] = [0x800xbf] = [128, 191] 开区间



4.如何取得字节ASCII码 - string.byte()

  • 原型:string.byte (s [, i [, j] ])
  • 解释:函数返回字符s[i], s[i+1], ···, s[j]的内部数字编码(ASCII码),其中参数i的默认值是1,而参数j的默认值是i。



5.字符是由几个字节组成

读取第一个字节,在以下区间的代表不同的字节数:

  1. [0, 0xc0) 表示这个字符仅由1个字节构成
  2. [0xc0, 0xe0) 表示这个字符由2个字节构成
  3. [0xe0, 0xf0) 表示这个字符由3个字节构成
  4. [0xf0, 0xff) 表示这个字符由4个字节构成



 

-- 判断utf8字符byte长度
-- [0, 0xc0) 表示这个字符仅由1个字节构成 [0,192)
-- [0xc0, 0xe0) 表示这个字符由2个字节构成 [192,224)
-- [0xe0, 0xf0) 表示这个字符由3个字节构成 [224,240)
-- [0xf0, 0xff) 表示这个字符由4个字节构成 [240,255)
function Utils.getChrSize(char)
    if not char then
        return 0
    elseif char >= 240 then
        return 4
    elseif char >= 224 then
        return 3
    elseif char >= 192 then
        return 2
    elseif char >= 0 then
        return 1
    end
end

6.附加几个常用的函数

我的需求:

-- 把字符串转换成第一个显示后面是**号   如:中国人 -> 中**
function Utils.changeTextExpress(str)
	if not str then return str end
	local tempStr = ""
	local len = string.utf8len(str)

	local first = string.byte(str, 1)
	local firstLen = sgs.utils.getChrSize(first)
	tempStr = string.sub(str, 1,firstLen)

	for i=1,len-1 do
		tempStr = tempStr .. "*"
	end

	return tempStr
end

再附加几个其他的方法:文章来源地址https://www.toymoban.com/news/detail-727627.html

-- 计算 UTF8 字符串的长度,每一个中文算一个字符
-- @function [parent=#string] utf8len
-- @param string input 输入字符串
-- @return integer#integer  长度

--[[--

计算 UTF8 字符串的长度,每一个中文算一个字符

~~~ lua

local input = "你好World"
print(string.utf8len(input))
-- 输出 7

~~~

]]

-- end --

function string.utf8len(input)
    local len  = string.len(input)
    local left = len
    local cnt  = 0
    local arr  = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
    while left ~= 0 do
        local tmp = string.byte(input, -left)
        local i   = #arr
        while arr[i] do
            if tmp >= arr[i] then
                left = left - i
                break
            end
            i = i - 1
        end
        cnt = cnt + 1
    end
    return cnt
end
-- 计算utf8字符串字符数, 中文按两个字符计算
function stringTool.utf8len_ChineseInTwo( str )
    local len = 0
    local currentIndex = 1
    while currentIndex <= #str do
        local char = string.byte(str, currentIndex)
        local charLength = stringTool.chsize(char)
        currentIndex = currentIndex + charLength
        if charLength > 2 then
            len = len + 2
        else
            len = len +1
        end        
    end
    return len
end
--截取字符串,按字符截取
-- str:         要截取的字符串
-- startChar:   开始字符下标,从1开始
-- numChars:    要截取的字符长度
function stringTool.utf8sub( str, startChar, numChars )
	local startIndex = 1
    while startChar > 1 do
        local char = string.byte(str, startIndex)
        startIndex = startIndex + stringTool.chsize(char)
        startChar = startChar - 1
    end
 
    local currentIndex = startIndex
 
    while numChars > 0 and currentIndex <= #str do
        local char = string.byte(str, currentIndex)
        currentIndex = currentIndex + stringTool.chsize(char)
        numChars = numChars -1
    end
    return str:sub(startIndex, currentIndex - 1), numChars
end

到了这里,关于lua 中文字符的判断简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS两种方法判断字符串是否包含中文

    第一种是正则表达式来判断,判断输入的字符中是否包含中文。 第二种是通过charCodeAt()来判断,字符串.charCodeAt(index)255 就是中文,否则是英文。

    2024年02月13日
    浏览(64)
  • Lua中文语言编程源码-第六节,更改lmathlib.c 数学库函数, 使Lua加载中文库关键词(与数学库相关)

    源码已经更新在CSDN的码库里: 在src文件夹下的lmathlib.c 数学库 函数,Standard mathematical library:表明这个C源文件实现了Lua的标准数学库(Standard mathematical library),即提供了与数学相关的API和功能实现。 增加中文版mathlib数学函数名列表,保留英文版mathlib数学函数名列表。 原

    2024年03月27日
    浏览(76)
  • 【论文简介】PP-OCRv1-v4中文字符识别论文概述

    相关论文 论文打包下载 - 提取码:0822 :https://pan.baidu.com/s/1WDXf-erVIPWxmoJRVX3_XA?pwd=0822 2009.PP-OCR: A Practical Ultra Lightweight OCR System 2109.PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System 2206.PP-OCRv3: More Attempts for the Improvement of Ultra Lightweight OCR System 2308. PP-OCRv4 :目前代码已发布(2023.08.07)

    2024年02月13日
    浏览(39)
  • 【C语言】判断字符类型的三种方法

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.字符的类型分类 1.ASCII的定义:  2.ASCII的产生原因是: 3.ASCII的内容: 二.字符类型判断相关库函数 1.isdigit(),用于判断字符是否为数字。 2. isalpha(),用于判断字符是否为字母。 3. isalnum(),用

    2024年02月06日
    浏览(45)
  • Python语言转义字符简介

    Python语言转义字符简介 转义字符(Escape Character)即标志着转义序列(escape sequence)开始的那个字符。 一些程序设计语言中就规定了一个用于转义的字符 ,它后面的字符不能按照这些字符的字面意义解释——转义字符开头的该字符序列具有不同于该字符序列单独出现(没有

    2023年04月18日
    浏览(45)
  • 判断字符串是否为回文的三种常用编程语言实现

    引言:回文是一种具有镜像对称性的字符串,即它从左到右读和从右到左读是相同的。回文可以在文学、语言学、数学、计算机科学等领域中得到广泛应用。在计算机科学中,判断一个字符串是否为回文是一项基本的算法挑战。在本文中,我们将介绍三种常见的编程语言中用

    2024年02月03日
    浏览(51)
  • 让Windows上vscode的C语言scanf函数可以读取中文字符

    区域设置–时钟和区域–区域–管理–更系统区域设置–(不要勾选)使用UTF-8。 查看验证当前字符集: cmd chcp 活动代码页: 936 936就是简体中文GBK 点击左下角设置齿轮 – 点击右上角文本样的图标 就可以打开json配置文件

    2024年01月17日
    浏览(52)
  • 中文编程入门(Lua5.4.6中文版)第四章 Lua 流程控制

    Lua 编程语言中的流程控制就像推塔游戏战场上的智谋队长,挥舞着策略之剑,根据战场局势(条件语句)的演变,精准地指挥团队成员执行或猛攻或防守的操作。在这场代码与逻辑的对战中,当判定条件亮起 “true” 的胜利信号时,指定的战术动作会被果断地施展,类似“全

    2024年03月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包