繁体   English   中英

从Unicode字符串中剥离空字节

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM