C# 用c语言读取多语言文本文件#

C# 用c语言读取多语言文本文件#,c#,windows,encoding,.net-4.5.2,C#,Windows,Encoding,.net 4.5.2,我必须阅读一个文本文件,其中可以包含以下语言的字符:英语、日语、汉语、法语、西班牙语、德语、意大利语 我的任务是简单地读取数据并将其写入新的文本文件(将新行char\n置于100个字符之后) 我不能使用File.ReadAllText和File.ReadAllLines,因为文件大小可能超过500 MB。因此,我编写了以下代码: using (var streamReader = new StreamReader(inputFilePath, Encoding.ASCII)) { u

我必须阅读一个文本文件,其中可以包含以下语言的字符:英语、日语、汉语、法语、西班牙语、德语、意大利语

我的任务是简单地读取数据并将其写入新的文本文件(将新行char
\n
置于100个字符之后)

我不能使用
File.ReadAllText
File.ReadAllLines
,因为文件大小可能超过500 MB。因此,我编写了以下代码:

using (var streamReader = new StreamReader(inputFilePath, Encoding.ASCII))
{
      using (var streamWriter = new StreamWriter(outputFilePath,false))
      {
           char[] bytes = new char[100];
           while (streamReader.Read(bytes, 0, 100) > 0)
           {
                 var data = new string(bytes);
                 streamWriter.WriteLine(data);
           }
           MessageBox.Show("Compleated");
       }
}
除了
ASCII
编码之外,我还尝试了
UTF-7
UTF-8
UTF-32
IBM500
。但在阅读和书写多语言文字方面运气不佳


请帮助我实现这一点。

您必须查看正在解析的文件的前4个字节。 这些字节将提示您必须使用什么编码

下面是我为完成任务而编写的一个助手方法:

public static string GetStringFromEncodedBytes(this byte[] bytes) {
    var encoding = Encoding.Default;
    var skipBytes = 0;
        if (bytes[0] == 0x2b && bytes[1] == 0x2f && bytes[2] == 0x76) {
            encoding = Encoding.UTF7;
            skipBytes = 3;
        }
        if (bytes[0] == 0xef && bytes[1] == 0xbb && bytes[2] == 0xbf) {
            encoding = Encoding.UTF8;
            skipBytes = 3;
        }

        if (bytes[0] == 0xff && bytes[1] == 0xfe) {
            encoding = Encoding.Unicode;
            skipBytes = 2;
        }

        if (bytes[0] == 0xfe && bytes[1] == 0xff) {
            encoding = Encoding.BigEndianUnicode;
            skipBytes = 2;
        }
        if (bytes[0] == 0 && bytes[1] == 0 && bytes[2] == 0xfe && bytes[3] == 0xff) {
            encoding = Encoding.UTF32;
            skipBytes = 4;
        }


        return encoding.GetString(bytes.Skip(skipBytes).ToArray());
    }

这是一个很好的开始,足以找到答案。如果i不等于100,则需要读取更多字符。像é这样的法语字符没有问题——它们都是在C#char类中处理的

char[] soFlow = new char[100];
int posn = 0;
using (StreamReader sr = new StreamReader("a.txt"))
   using (StreamWriter sw = new StreamWriter("b.txt", false))
      while(sr.EndOfStream == false)
      {
          try {
             int i = sr.Read(soFlow, posn%100, 100);
             //if i < 100 need to read again with second char array
             posn += 100;
             sw.WriteLine(new string(soFlow));
          }
          catch(Exception e){Console.WriteLine(e.Message);}
      } 
char[]soFlow=新字符[100];
int-posn=0;
使用(StreamReader sr=新StreamReader(“a.txt”))
使用(StreamWriter sw=新StreamWriter(“b.txt”,false))
while(sr.EndOfStream==false)
{
试一试{
int i=sr.Read(soFlow,位置%100100);
//如果i<100,则需要使用第二个字符数组再次读取
posn+=100;
sw.WriteLine(新字符串(soFlow));
}
catch(异常e){Console.WriteLine(e.Message);}
} 
规格:读取(字符[], Int32, Int32)从指定的索引开始,将指定的最大字符数从当前流读入缓冲区


当然对我有用:)

这将如何处理英文、日文、中文、法文、西班牙文、德文、意大利文的字符它不会处理特定的字符,它将告诉您整个文件的编码。如果您使用的是bytestream混合编码,则需要检查流中是否有编码开始,并使用检测到的编码处理流的其余部分(直到下一个编码开始)。如果您正在阅读的文件是一个完整的混合语言,没有任何关于所用编码的声明,我很抱歉,我将没有帮助。虽然这可能是检测文件编码所必需的,但它不是完整的答案,因为它没有显示如何读取文件的其余部分。这可能就是为什么有人否决了它。添加一个使用这种方法读取整个文件的示例非常容易。语言并不重要(如果您真的需要计算字符,也称为符号)。重要的是编码,这些特殊字符是如何存储的。如果编码使用8位来表示字符(ASCII),那么您的方法是可以的,因为读取100字节等于读取100个字符:只需在写入每个部分后添加
'\n'
。否则()你确实有麻烦了,你必须知道/。你必须弄清楚文本是如何编码的。如果文件包含亚洲和西方语言,则可能是Unicode、大端Unicode或UTF32。希望文件以编码指示符开始,如Christian Jäger的回答所示。或者它可能是一种混合编码,在这种情况下,您必须了解文件的结构。你甚至可能需要检查文本并推断编码,这一点都不简单。如果没有按照规范、惯例或标准进行编码,可以选择“发回”。“检测”编码是最后的手段。我认为这应该会有所帮助