[英]Stripping null bytes from a unicode string
我的路径是UTF-16字符串。 它们中的大多数仅使用ASCII集,因此像test
这样的文件名将存储为
T \x00 E \x00 S \x00 T \x00
我使用Encoding.Unicode.GetString(bytes)
读取字符串,并且工作正常(当我将它们打印到控制台或窗体控件中时,正如我期望的那样),但是当我想使用给定的文件创建文件时使用以下代码的文件名
BinaryWriter outFile = new BinaryWriter(File.OpenWrite(path));
我有一个例外
Unhandled Exception: System.ArgumentException: Illegal characters in path.
at System.IO.Path.CheckInvalidPathChars(String path)
at System.IO.Path.GetFileName(String path)
可能是因为那里有空字符(也许它在内部存储了原始字节数组),但是我不确定如何处理它。 但是,并非所有的字符串都是ASCII,并且某些字符使用两个字节。
更新:
原来,非法字节只是填充到字符串中的空字节。 但是,我不能简单地剥离所有结尾的空字节,但是我也不知道字符串的长度。 如何从每个字符以n个字节存储的字符串中删除空字节?
从MSDN上的“ Path.GetInvalidPathChars”
无效字符的完整集合可能因文件系统而异。 例如,在基于Windows的桌面平台上,无效的路径字符可能包括ASCII / Unicode字符1到31,以及引号(“),小于(<),大于(>),竖线(|),退格键( \\ b),空(\\ 0)和制表符(\\ t)。
您可以使用Path.GetInvalidPathChars
作为过滤器。 在过滤任何与Path.CheckInvalidPathChars
中的字符匹配的字符时,将输入字符串复制到输出字符串。
这是我准备的一个示例:
string input = @"This <path> ""contains"" |some| ~invalid~ characters";
var invalidChars = Path.GetInvalidPathChars();
string output = input.Aggregate(new StringBuilder(), (sb, c) => invalidChars.Contains(c) ? sb : sb.Append(c), sb => sb.ToString());
// output contains: This path contains some ~invalid~ characters
请注意,大多数符号都被滤除,但代字号却没有,因为它们是有效的路径字符。
您最有可能收到此错误,因为如果您调用Path.GetInvalidPathChars()
,则路径中包含可用的无效字符之一。
其中一些字符为"
, <
, |
和>
。
因为您已经使用Encoding.Unicode.GetString
对该字符串进行了解码,所以此问题与任何UNICODE编码问题都不相关。
这是一些简单(但效率不高)的代码,用下划线替换路径中的无效字符:
var stringBuilder = path
.Select(c => Path.GetInvalidPathChars().Contains(c) ? '_' : c)
.Aggregate(new StringBuilder(), (a, c) => a.Append(c));
path = stringBuilder.ToString();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.