lua html 转义字符,Lua中特殊字符过滤(UTF8编码)
Table of Contents
提纲
思路
中文Unicode
Unicode和UTF8的联系
常见特殊字符
过滤特殊字符
思路
常见的特殊字符有很多,查了很多资料,没找到特殊字符的Unicode编码范围,即使找到了也难以保证覆盖了全部。因此只能从非的角度考虑, 实现目标是留下操作系统支持的可作为文件名的字符。
中文Unicode编码
字符集字数Unicode编码
基本汉字20902字4E00-9FA5基本汉字补充74字9FA6-9FEF扩展A6582字3400-4DB5扩展B42711字20000-2A6D6扩展C4149字2A700-2B734扩展D222字2B740-2B81D扩展E5762字2B820-2CEA1扩展F7473字2CEB0-2EBE0康熙部首214字2F00-2FD5部首扩展115字2E80-2EF3兼容汉字477字F900-FAD9兼容扩展542字2F800-2FA1DPUA(GBK)部件81字E815-E86F部件扩展452字E400-E5E8PUA增补207字E600-E6CF汉字笔画36字31C0-31E3汉字结构12字2FF0-2FFB汉语注音43字3105-312F注音扩展22字31A0-31BA〇1字3007
其中只需要考虑基本汉字字符集即可。
根据字符的UTF8编码获取Unicode
UTF8和Unicode的关系网上资料很多, 在此不再赘述,简而言之,中文的UTF8编码都是三个字节,1110xxxx 10xxxxxx 10xxxxxx, 剩余的16位正好放下Unicode编码的两个字节,因此只要取出这16位即可知道该字符的Unicode
Lua不支持位操作, b1 % 0xe0 代表 b1 & 0xe0,*212代表左移12位,依次类推
local b1 = string.byte(str, curIndex)
local b2 = string.byte(str, curIndex + 1)
local b3 = string.byte(str, curIndex + 2)
local unic = (b1 % 0xe0) * 2 ^ 12 + (b2 % 0x80) * 2 ^ 6 + (b3 % 0x80);
需要过滤掉的特殊字符
ASCII中Windows不支持作为文件名的字符正则: [\\\\/:*?\"<>|%s+ ]
两个字节的UTF
UTF编码在四个字节及四个字节以上的字符
代码实现
-- 过滤中文特殊字符
function filterInvalidChars(str)
local result = '';
local curIndex = 1;
-- 逐字检查, 符合要求则放入result
repeat
local curByte = string.byte(str, curIndex)
if curByte > 0 and curByte <= 127 then
result = result..string.sub(str, curIndex, curIndex)
curIndex = curIndex + 1
elseif curByte >= 192 and curByte <= 223 then
curIndex = curIndex + 2
elseif curByte >= 224 and curByte <= 239 then
-- 此处判断一些中文特殊字符
local b1 = curByte
local b2 = string.byte(str, curIndex + 1)
local b3 = string.byte(str, curIndex + 2)
local unic = (b1 % 0xe0) * 2 ^ 12 + (b2 % 0x80) * 2 ^ 6 + (b3 % 0x80)
if unic >= 0x4e00 and unic <= 0x9FA5 then
result = result..string.sub(str, curIndex, curIndex + 2)
end
curIndex = curIndex + 3
elseif curByte >= 240 and curByte <= 247 then
curIndex = curIndex + 4
else
logger:error('filter invalid chars error: '..str)
return str
end
until(curIndex >= #str);
return string.gsub(result, '[\\\\/:*?\"<>|%s+ ]', '');
end
lua html 转义字符,Lua中特殊字符过滤(UTF8编码)相关推荐
- javascript中的Base64.UTF8编码与解码详解
javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...
- bee 字符串转int_beego中gbk和utf8编码转换问题
beego中gbk和utf8编码转换问题,这个问题非常重要,有时候从gbk采集过来转成utf8也非常重要. func Get_cate_urls(url string) (map[int]string ...
- MFC开发IM-第二十二篇、C++中 Unicode 与 UTF-8 编码互转
1.简述 最近在发送网络请求时遇到了中文字符乱码的问题,在代码中调试字符正常,用抓包工具抓的包中文字符显示正常,就是发送到服务器就显示乱码了,那就要将客户端和服务器设置统一的编码(UTF-8),而我们 ...
- uos系统中windows格utf8编码文件转GBK
1.utf8转GBK: iconv -c -f UTF-8 -t GBK sql脚本名 -o 转换gbk后的sql脚本名 2.windows文件行尾回车换行符转换为linux换行符: tr -d '\ ...
- php韩文编码,PHP中GBK和UTF8编码处理(中文,韩文)
一.编码范围 1. gbk (gb2312/gb18030) x00-xff gbk双字节编码范围 x20-x7f ascii xa1-xff 中文 x80-xff 中文 2. utf-8 (unic ...
- 关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法
关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法 1985 T.于星期四, 07/03/2013 - 20:36提交 在android开发中,经常会碰到edittext ...
- JAVA输出带BOM的UTF-8编码的文件
https://blog.csdn.net/comeonyangzi/article/details/81708134 当从http 的response输出CSV文件的时候,设置为utf8的时候默认是 ...
- 【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM
一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理 ...
- 关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
出处: https://www.cnblogs.com/haimishasha/p/6117968.html 目录 1.1. ISO-8859-1 通常叫做Latin-1 1.2. GB2312/GB ...
- python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题
近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据. #-*- coding:utf-8 -*- classIpUrlManager(object):def __init ...
最新文章
- Java Collection框架—List\ set \map 的异同世界
- 为Nginx制作404 403 500等错误页面
- [原创] nunit2report V1.2.2 release 汉化修正版 V1.0
- 模板的日常~。~。。。(持续更新中...)
- linux内核make menuconfig执行过程
- Spark streaming 概述
- 【OpenCV】基本数据类型
- Gliffy confluence插件的破解
- java 二叉树转数组_java二叉树怎么转成数组?java怎么实现二叉树?
- win10电脑chm文件打不开的解决方法
- JS 转换格林尼治时间
- Android 根据逗号分隔String
- 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
- CCT Camera Tuning
- 免费生成微信小程序的经验
- CA认证及http实现方法
- libcoap 接口分析与 CoAP 协议开发
- 固定电话呼叫转移设置方法
- EVILBOX: ONE靶机
- java web前端面试题_web前端笔试试题(答案)