【问题标题】:C# System.IO.Directory.CreateDirectory - create directory with utf-8 characters?C# System.IO.Directory.CreateDirectory - 创建带有 utf-8 字符的目录?
【发布时间】:2012-05-02 14:15:55
【问题描述】:

我从 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

我发誓这是相同的代码,因为我复制了我的 .exe 文件。

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

很乐意解释:-)

【问题讨论】:

  • Directory.CreateDirectory(@"Bohouš"); Console.WriteLine("{0}", Directory.Exists(@"Bohouš")); 输出True。
  • @Nick 我刚刚添加了代码。
  • @sixlettervariables 你是对的,这也适用于我的电脑,但不适用于其他电脑
  • 您在 XP 机器上写入的分区类型是什么? FAT32? NTFS?
  • 在 XP 机器上有 NTFS,我正在写入桌面上的文件夹 (C:)

标签: c# utf-8


【解决方案1】:

在 Windows 上,您不指定文件或目录名称的编码。在 NTFS 上,它们总是使用本质上是 UTF-16 的编码。只要您正确读取字符串, CreateDirectory 就会做您想做的事情。我怀疑您要么没有将 UTF-8 文件读取为 UTF-8,要么您的文件实际上不是 UTF-8。在使用它调用 CreateDirectory 之前,在调试器中查看字符串值是什么。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你是对的。在某些计算机上,它可以正确读取文件,而在某些计算机上则不能。这是阅读问题。
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      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): 部分匹配,仅对应于当前操作系统代码页的字符 将被正确解码

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-01-13
          • 1970-01-01
          • 2016-06-09
          • 1970-01-01
          • 2014-02-10
          • 2020-07-25
          • 1970-01-01
          • 2021-08-13
          相关资源
          最近更新 更多