当前位置: 首页 > 知识库问答 >
问题:

与文件名中包含unicode字符的文件交互/转义序列问题

管景天
2023-03-14

我试图获取一个文件名中包含unicode字符的文件的句柄。

例如,我有一个名为c:\testö.txt的文件。如果我尝试new FileInfo(“c:\testö.txt”),我会得到一个非法字符异常。

再次尝试转义序列:新的文件信息(“c:\test\u00f8.txt”),它的工作原理!耶!

所以我有一个方法来转义非ASCII字符:

static string EscapeNonAsciiCharacters(string value)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in value)
    {
        if (c > 127)
        {
            // This character is too big for ASCII
            string encodedValue = "\\u" + ((int)c).ToString("x4");
            sb.Append(encodedValue);
        }
        else
        {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

但当我从这个方法中获取输出时,转义字符似乎不正确。

EscapeNonAsciiCharacters("c:\testø.txt")  ## => "c:\test\\u00f8.txt"

当我将输出传递给< code>FileInfo构造函数时,我再次得到非法字符异常。但是< code>c:\中的< code>\似乎没有改变。当我在静态方法中查看这个字符在StringBuilder中是如何表示的时,我看到:< code>{c: est\u00f8.txt},这使我相信第一个反斜杠的转义方式不同。

如何在EscapeNonAsciiCharacters中正确附加循环转义的字符,以便在输出中不获得双转义字符?

共有2个答案

鞠子轩
2023-03-14

你似乎误解了逃出来的人物。

在这个C#代码中,是编译器将ø转换为正确的unicode字符:

new FileInfo("c:\test\u00f8.txt") // (the "\t" is actually causing an error here)

您在这里所做的只是将encodedValue设置为字符串“\u00f8”,并且根本没有办法将转义字符串转换为转换后的字符串:

string encodedValue = "\\u" + ((int)c).ToString("x4");

如果您想转换转义字符串,那么您需要做类似这样的事情:

如何将包含转义字符的字符串转换为字符串

金何平
2023-03-14

您在这些字符串中转义的次数比您预期的要多。请注意,字符串中时需要对 \ 进行转义,因为它本身就是转义字符,\t 表示制表符。

使用NTFS的Windows完全支持unicode,因此原始错误很可能是由于您没有转义\字符。

我编写了一个玩具应用程序来处理名为ʚ的文件。txt,构造函数对该字符或任何其他unicode字符没有问题。

因此,我们没有编写< code >新的FileInfo("c:\test。txt"),您需要编写< code >新的FileInfo("c:\\test。txt")或< code>new FileInfo(@"c:\test。txt")。

在一般的 C# 和 NTFS(或者,实际上是大多数现代文件系统)的上下文中,你的转义函数是完全不必要的。外部库本身可能与 unicode 不兼容,但这需要单独处理。

 类似资料:
  • 大家好,提前致谢! 我正在处理一个处理utf-8字符串并替换特定字符的Python脚本。因此,我使用,同时通过一个定义unicode字符及其所需替换的列表进行循环,如下所示。 到目前为止,一切都很好。但现在考虑一个包含要替换的字符的csv文件,如下所示。 由于转义字符的原因,我很不幸地未能将csv数据读入列表。我使用< code>csv模块读取数据,如下所示: 这将导致像< code>('\\U0

  • 在JSON中,Unicode字符可以使用表示法进行转义。我假设显然是指十六进制的Unicode代码点。 但由于只有4位数字,这是否意味着无法转义

  • 问题内容: 我正在尝试在NetBeans 6.0.1中使用OpenCSV解析.csv文件。我的文件包含一些Unicode字符。当我在输出中写入字符时,字符以其他形式显示,例如(HJ1’-E /;)。当我在记事本中打开此文件时,它看起来还可以。 我使用的代码: 问题答案: 首先,您需要知道文件的编码格式,例如UTF-8或UTF-16。生成此文件的原因是什么? 在那之后,它相对简单- 您需要创建一个包

  • 如何在包含字符的文件上执行gradle processResources,而不转义文件中的字符? 我有一些静态html文件,位于Spring Boot参考文档建议的“资源/静态”文件夹中。然而,当我尝试执行gradle processResources时,gradle抛出了一个异常 据我所知,出现此问题的原因是,其中一个静态文件中有一个字符,并且在处理资源时,它是表达式的保留字符。 建议的解决方案

  • 问题内容: 我正在尝试通过Linux CLI在文件中查找电子邮件地址的基础上删除错误的电子邮件。 我可以用 但是我无法弄清楚如何从那里删除它们,因为以下代码不起作用。 谢谢您的帮助。 问题答案: 为了安全起见,我通常将find的输出通过管道传送到awk之类的文件,并创建一个批处理文件,每行均为“ rm filename” 这样,您可以在实际运行它之前对其进行检查,并手动修复用正则表达式难以处理的任

  • 本文向大家介绍Java实现中文字符串与unicode互转工具类,包括了Java实现中文字符串与unicode互转工具类的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现中文字符串与unicode互转的具体代码,供大家参考,具体内容如下 原理利用了java实现js的escape以及unescape函数。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊