过滤Windows文件名中的非法字符

转载:http://blog.csdn.net/infoworld/article/details/42033097

场景:

1. 通常生成文件时需要一个文件名,而生成文件名的方式可能是通过用户输入的字符,但是有些字符在windows上是不能作为文件名的,强行创建这类文件会失败。

2.一般可以通过正则表达式替换所有的非法字符,这里实现的是C++98 template(模板)方式的替换无效字符,std::string,std::wstring. 基本上windows上和字符串打交道都离不开wstring.

 1 template<class T>
 2 void FilterInvalidFileNameChar(T& str)
 3 {
 4     T t;
 5     t.resize(9);
 6     t[0] = 0x5C; //    \
 7     t[1] = 0x2F; //    /
 8     t[2] = 0x3A; //    :
 9     t[3] = 0x2A; //    *
10     t[4] = 0x3F; //    ?
11     t[5] = 0x22; //    "
12     t[6] = 0x3C; //    <
13     t[7] = 0x3E; //    >
14     t[8] = 0x7C; //    |
15     int length = str.length();
16     for(int i = 0; i< length; ++i)
17     {
18         if(t.find(str[i]) != T::npos )
19         {
20             str[i] = 0x5F;
21         }
22     }
23 }
1 inline char* Unicode2Ansi(const wchar_t* unicode)
2 {
3     int len;
4     len = WideCharToMultiByte(CP_ACP, 0, unicode, -1, NULL, 0, NULL, NULL);
5     char *szUtf8 = (char*)malloc(len + 1);
6     memset(szUtf8, 0, len + 1);
7     WideCharToMultiByte(CP_ACP, 0,unicode, -1, szUtf8, len, NULL,NULL);
8     return szUtf8;
9 }   

调用:

1 std::wstring wss(L"/asfasdf中国asdfas*dfa.txt");
2 FilterInvalidFileNameChar(wss);
3 cout << Unicode2Ansi(wss.c_str()) << endl;
4
5 std::string ss("/asfasdf\\asdfas*dfa.txt");
6 FilterInvalidFileNameChar(ss);
7 cout << ss.c_str() << endl;

输出:

_asfasdf中国asdfas_dfa.txt
_asfasdf_asdfas_dfa.txt

 
时间: 2024-12-14 11:27:28

过滤Windows文件名中的非法字符的相关文章

[C/C++标准库]_[初级]_[过滤Windows文件名中的非法字符]

场景: 1. 通常生成文件时需要一个文件名,而生成文件名的方式可能是通过用户输入的字符,但是有些字符在windows上是不能作为文件名的,强行创建这类文件会失败. 2.一般可以通过正则表达式替换所有的非法字符,这里实现的是C++98 template(模板)方式的替换无效字符,std::string,std::wstring. 基本上windows上和字符串打交道都离不开wstring. 函数: template<class T> void FilterInvalidFileNameChar(

【转载】在Windows终端中显示UTF-8字符

一直苦恼于如何在Windows终端中显示UTF-8字符的问题.比如,在MySQL命令行下,如果数据库的编码是UTF-8,那么,在查询数据库的时候,里面的中文都会变成乱码.今天半无意的搜索了一下,结果发现解决方案非常简单:1. 修改终端的代码页.在终端中输入:chcp 65001 2. 右键点击任务栏上的终端(也可以单击窗口左上角的图标),在快捷菜单中选择属性,在里面选择字体——如 Lucida Console,不要选择“点阵字体”:确定之后,再次测试UTF-8输出,你看到了什么. :)要切换回原

去除下载电影和电视剧文件名中的多余字符[python实现]

讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),,搞得文件名好长,可以使用下面的Python代码,自行修改即可. [python] view plaincopy #!\usr\bin\env python # -*- coding: utf-8 -*- # Author: 吴徐平 # FileName: RefineFileName.py # Function: # 下载的电影电视文件名太长, # 常常含有多余的字符,如'中英双字幕', # 可以使用本Python代码去掉 # Usi

SVN版本冲突中 Files 的值“ &lt; &lt; &lt; &lt; &lt; &lt; &lt; .mine”无效路径中具有非法字符的解决办法

.NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译,会弹出上面的错误,这时候将项目隐藏的文件全部显示,删除 /bin 和 /obj 目录,重新编译,这个时候上面的错误会减少,剩余几个错误,就说明有几个项目的编译出错. 2.继续按照方法一,去编译其他的项目.注意:删除/bin 和 /obj 目录后再编译. 二. 还有一个地方,也会导致这个错误,在项目文件中,就是

SVN提交出现“&lt; &lt; &lt; &lt; &lt; &lt; &lt; .mine’无效,路径中具有非法字符”的问题

使用SVN提交或更新后经常会出现”Files 的值’< < < < < < < .mine’无效.路径中具有非法字符”的错误.查阅了下资料,是因为:你更改了一个文件,服务器上相应的文件也改变了,于是文件不能自己合并.解决冲突.你需要自己确定使用哪一个文件.SVN进行管理时,把(与服务器上对应文件)不同的部分写入源文件或添加了以.mine..rs*后缀的文件.  解决方法:在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolut

Files 的值“ &lt; &lt; &lt; &lt; &lt; &lt; &lt; .mine”无效。路径中具有非法字符。

使用SVN进行更新的时候,出现了这样的问题:Files 的值“ < < < < < < < .mine”无效.路径中具有非法字符. 解决方法:解决冲突,告诉SVN这个问题已解决(Resolved).一般更简单些:在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolute.txt的文件打开并删除含有'<<<<<<< .mine'或类似的字段,重新编译即可. 如果没有成功,可以考虑直接把D

错误 1 Files 的值“&lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine”无效。路径中具有非法字符。

Microsoft Visual Studio 2010项目编译的时候,提示如下错误: 错误 1 Files 的值"<<<<<<< .mine"无效.路径中具有非法字符. 解决办法: 在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolute.txt的文件打开并删除含有'<<<<<<< .mine'或类似的字段,重新编译即可.第一次尝试解决,没有成功,可以尝试直接把

xml中的非法字符

今使用Jdom生成xml文件的时候,总是出现0x0,0x8为非法字符,经过搜索,问题原因及解决方法如下: 原因: xml中需要过滤的字符分为两类,一类是不允许出现在xml中的字符,这些字符不在xml的定义范围之内.另一类是xml自身要使用的字符,如果内容中有这些字符则需被替换成别的字符. 第一类字符: 对于第一类字符,我们可以通过W3C的XML文档来查看都有哪些字符不被允许出现在xml文档中. XML允许的字符范围是“#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE0

Android studio中出现非法字符时的部分解决方法

我将原来在Eclipse中开发的工程搬到了Android studio上来,在运行,编译程序的过程中出现了错误.提示存在非法字符. 后来发现是由于程序代码中有中文字符的出现,问题就出在对中文支持的UTF-8编码上. utf-8编码分为BOM和非BOM两种格式.有bom头的存储或者字节流,它一定是unicode字符集编码.究竟属于那一种utf-8还是utf-16还是utf-32)可以通过BOM头来进行判断.在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码.UT