从unicode字符串中删除空字节

时间:2012-08-19 21:15:23

标签: c#

我的路径是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个字节存储?

2 个答案:

答案 0 :(得分:2)

From the MSDN on `Path.GetInvalidPathChars'

  

完整的无效字符集可能因文件系统而异。对于   例如,在基于Windows的桌面平台上,路径字符无效   可能包括ASCII / Unicode字符1到31,以及引用   (“),小于(<),大于(>),管道(|),退格(\ b),null   (\ 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

请注意,大多数符号都会被滤除,但波浪号不是,因为它们是有效的路径字符。

答案 1 :(得分:1)

您最有可能收到此错误,因为如果您拨打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();