C#System.IO.Directory.CreateDirectory - 用utf-8字符创建目录?

时间:2012-05-02 14:15:56

标签: c# utf-8

我从utf-8编码文件中读取数据。然后,此文件的部分内容将用作新创建的文件夹的名称。但是,我的文件夹名称是:

bohou _120328而不是bohouš_120328

如何为新创建的文件夹名称设置正确的编码?感谢。

修改

我正在以这种方式从文件中读取信息:

System.IO.StreamReader file = new System.IO.StreamReader(nameOfFile);

 while ((j = file.ReadLine()) != null) { 
    //manipulating string in j
 }

然后用

创建目录
if (Directory.Exists(folder) == false) {
                                    Console.WriteLine("creating directory " + folder);
                                    System.IO.Directory.CreateDirectory(@folder);
                                } 

如果我在Windows 7,64位计算机上运行我的应用程序,一切都很好。但是,如果我在其他使用WinXP等旧系统的计算机上运行,​​编码就错了,看起来像这样

bohou�_120328

在使用变量创建文件夹之前,我将i写入输出,但一切都很好。甚至文件夹名称也没问题。但不幸的是,就在我的电脑上。

EDIT2

事情变得更加奇怪。我使用这段代码How do I remove diacritics (accents) from a string in .NET?来删除变音符号,因为没有变音符号的名字对我来说就好了。

但是,再次:

  1. 在我的计算机上运行代码产生了bohous_120328
  2. 在其他计算机上运行代码,我的闪存盘产生到bohou _120328
  3. 我发誓它是相同的代码,因为我复制了我的.exe文件。

    调试器说在创建文件夹之前问题已存在于我的字符串变量中。我不明白,在这种情况下环境如何影响我的变量。

    很乐意解释: - )

5 个答案:

答案 0 :(得分:6)

在Windows上,您不指定文件或目录名称的编码。在NTFS上,它们总是用基本上是UTF-16的编码。只要您正确读入字符串,CreateDirectory就会执行您想要的操作。我怀疑你要么没有把你的UTF-8文件读成UTF-8,要么你的文件实际上不是UTF-8。在使用它调用CreateDirectory之前,请查看调试器的字符串值。

答案 1 :(得分:4)

我认为你读错了文件。您应该先检查阅读文本。

答案 2 :(得分:1)

我怀疑这与您的代码如何读取文本或如何将其作为目录名写出来无关。我敢打赌,这是你正在创建目录的操作系统或分区类型的限制。我的猜测是OS /分区无法处理带有变音符号的字符,或者它被正确写入只是为了错误地显示

本文提供了有关如何扩展文件系统以允许变音字符的一些信息(无论如何,对于NTFS):

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fsutil_behavior.mspx

其他分区类型可能有类似的信息(您仍然没有回答六个变量的评论,询问您正在使用的分区类型)。

答案 3 :(得分:1)

StreamReader的默认编码是UTF-8。 如果您的文件不是UTF-8编码,您将无法确保在本地化版本的操作系统上获得正确的字符。

我的意思是:

  • 文件内容为UTF-8& new StreamReader(path) :编码匹配:否 问题

  • 文件内容为UTF-8& new StreamReader(path, Encoding.Default) :部分匹配,只有与当前操作系统代码页对应的字符才能正确解码

  • 文件内容为ANSI(Windows默认设置)& new StreamReader(path) :编码 不匹配,仅AFAIK ASCII字符将被解码

  • 文件内容为ANSI& new StreamReader(path, Encoding.Default) : 部分匹配,仅对应于当前OS代码页的字符 将被正确解码

检查文件编码和操作系统默认代码页可能会帮助您找到问题。

答案 4 :(得分:1)

StreamReader attempts to detect编码,默认情况下不使用UTF8。

我建议在构造函数中提供Encoding.UTF8 如果这没有帮助,我的猜测是你的文件内容不是真正的UTF8,而且你依赖于计算机的区域设置。