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编码)相关推荐

  1. javascript中的Base64.UTF8编码与解码详解

    javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...

  2. bee 字符串转int_beego中gbk和utf8编码转换问题

    beego中gbk和utf8编码转换问题,这个问题非常重要,有时候从gbk采集过来转成utf8也非常重要. func Get_cate_urls(url string) (map[int]string ...

  3. MFC开发IM-第二十二篇、C++中 Unicode 与 UTF-8 编码互转

    1.简述 最近在发送网络请求时遇到了中文字符乱码的问题,在代码中调试字符正常,用抓包工具抓的包中文字符显示正常,就是发送到服务器就显示乱码了,那就要将客户端和服务器设置统一的编码(UTF-8),而我们 ...

  4. uos系统中windows格utf8编码文件转GBK

    1.utf8转GBK: iconv -c -f UTF-8 -t GBK sql脚本名 -o 转换gbk后的sql脚本名 2.windows文件行尾回车换行符转换为linux换行符: tr -d '\ ...

  5. php韩文编码,PHP中GBK和UTF8编码处理(中文,韩文)

    一.编码范围 1. gbk (gb2312/gb18030) x00-xff gbk双字节编码范围 x20-x7f ascii xa1-xff 中文 x80-xff 中文 2. utf-8 (unic ...

  6. 关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法

    关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法 1985 T.于星期四, 07/03/2013 - 20:36提交 在android开发中,经常会碰到edittext ...

  7. JAVA输出带BOM的UTF-8编码的文件

    https://blog.csdn.net/comeonyangzi/article/details/81708134 当从http 的response输出CSV文件的时候,设置为utf8的时候默认是 ...

  8. 【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

    一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理 ...

  9. 关于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 ...

  10. python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题

    近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据. #-*- coding:utf-8 -*- classIpUrlManager(object):def __init ...

最新文章

  1. Java Collection框架—List\ set \map 的异同世界
  2. 为Nginx制作404 403 500等错误页面
  3. [原创] nunit2report V1.2.2 release 汉化修正版 V1.0
  4. 模板的日常~。~。。。(持续更新中...)
  5. linux内核make menuconfig执行过程
  6. Spark streaming 概述
  7. 【OpenCV】基本数据类型
  8. Gliffy confluence插件的破解
  9. java 二叉树转数组_java二叉树怎么转成数组?java怎么实现二叉树?
  10. win10电脑chm文件打不开的解决方法
  11. JS 转换格林尼治时间
  12. Android 根据逗号分隔String
  13. 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
  14. CCT Camera Tuning
  15. 免费生成微信小程序的经验
  16. CA认证及http实现方法
  17. libcoap 接口分析与 CoAP 协议开发
  18. 固定电话呼叫转移设置方法
  19. EVILBOX: ONE靶机
  20. java web前端面试题_web前端笔试试题(答案)

热门文章

  1. HTML5 — 知识篇总结《I》【入门知识】
  2. 对此人的嚣张你们怎么看
  3. [NOI2015]寿司晚宴——状压dp
  4. python--os
  5. JAVA中反射机制五(JavaBean的内省与BeanUtils库)
  6. js中map和python中的map
  7. 《大道至简——软件工程实践者的思想》阅读笔记之一
  8. CSS彻底研究(3) - 浮动,定位
  9. poj 1125 Stockbroker Grapevine 代码及分析
  10. MP3文件格式说明 (转)