2012-04-24 99 views
1

任何人都可以帮我吗?我尝试了很多不同的方式,但我没有得到理想的结果。我只是想将现有文本[.txt]文件的编码从ANSI更改为UTF8,其中包含像ö,ü等字符。当我通过在编辑模式下打开该文本文件并手动执行FILE => SAVE AS时,它在编码列表中显示ANSI。使用这个,我可以将其编码从ANSI更改为UTF8,并且在这种情况下它不会更改任何内容/字符。但是当使用CODE时,它不起作用。将文本文件的编码从ANSI更改为UTF8,而不会影响C#中文件的任何字符!

==>第一种方法我用于实现由以下编码:

if (!System.IO.Directory.Exists(System.Windows.Forms.Application.StartupPath + "\\Temp")) 
{ 
    System.IO.Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + "\\Temp"); 
} 
string destPath = System.Windows.Forms.Application.StartupPath + "\\Temp\\temporarytextfile.txt"; 

File.WriteAllText(destPath, File.ReadAllText(path, Encoding.Default), Encoding.UTF8); 

==>第二替代其中我使用:

using (Stream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using (Stream destStream = new FileStream(destPath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) 
    { 
     using (var reader = new BinaryReader(fileStream, Encoding.Default)) 
     { 
      using (var writer = new BinaryWriter(destStream, Encoding.UTF8)) 
      { 
       var srcBytes = new byte[fileStream.Length]; 
       reader.Read(srcBytes, 0, srcBytes.Length); 
       writer.Write(srcBytes); 

      } 
     } 
    } 
} 

==>我使用第三备选:

System.IO.StreamWriter file = new System.IO.StreamWriter(destPath, true, Encoding.Default); 
using (StreamReader sr = new StreamReader(path, Encoding.UTF8, true)) 
{ 
    String line1; 
    while ((line1 = sr.ReadLine()) != null) 
    { 
     file.WriteLine(line1); 
    } 
} 

file.Close(); 

但不幸的是,上述解决方案都没有为我工作。

回答

5

ANSI的问题在于它不是一种特定的编码,它只是一个术语,表示“某些8位编码是系统默认创建的”。

如果文件是在同一个系统上创建的,并且默认编码没有改变,那么您可以使用Encoding.Default来读取它,这样你的第一个和第三个版本就可以工作。 (您的第二个版本只是复制文件而不做任何更改。)否则,您必须确切知道使用了哪种编码。

这个例子使用了Windows的1250代码页:

File.ReadAllText(path, Encoding.GetEncoding(1250)) 

可用编码的列表,请参阅Encoding class的文档。

-1

你试过以下:

http://msdn.microsoft.com/en-us/library/system.text.encoding.convert%28v=vs.71%29.aspx

using System; 
using System.Text; 
namespace ConvertExample 
{ 
    class ConvertExampleClass 
    { 
     static void Main() 
     { 
     string unicodeString = "This string contains the unicode character Pi(\u03a0)"; 

     // Create two different encodings. 
     Encoding ascii = Encoding.ASCII; 
     Encoding unicode = Encoding.Unicode; 

     // Convert the string into a byte[]. 
     byte[] unicodeBytes = unicode.GetBytes(unicodeString); 

     // Perform the conversion from one encoding to the other. 
     byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes); 

     // Convert the new byte[] into a char[] and then into a string. 
     // This is a slightly different approach to converting to illustrate 
     // the use of GetCharCount/GetChars. 
     char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)]; 
     ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0); 
     string asciiString = new string(asciiChars); 

     // Display the strings created before and after the conversion. 
     Console.WriteLine("Original string: {0}", unicodeString); 
     Console.WriteLine("Ascii converted string: {0}", asciiString); 
     } 
    } 
} 
+0

这不以任何方式适用于问如问。 – 2017-12-13 11:36:27

0

我有同样的需求。这里是我如何进行:

int Encode(string file, Encoding encode) 
    { 
     int retour = 0; 
     try 
     { 
      using (var reader = new StreamReader(file)) 
      { 
       if (reader.CurrentEncoding != encode) 
       { 
        String buffer = reader.ReadToEnd(); 
        reader.Close(); 
        using (StreamWriter writer = new System.IO.StreamWriter(file, false, encode)) 
        { 
         writer.Write(buffer); 
         writer.Close(); 
        } 
        message = string.Format("Encode {0} !", file); 
        retour = 2; 
       } 
       else retour = 1; 
      } 
     } 
     catch(Exception e) 
     { 
      message = string.Format("{0} ?", e.Message); 
     } 
     return retour; 
    } 

    /// <summary> 
    /// Change encoding to UTF8 
    /// </summary> 
    /// <param name="file"></param> 
    /// <returns></returns> 
    public int toUTF8(string file) 
    { 
     return Encode(file, Encoding.UTF8); 
    } 

    public int toANSI(string file) 
    { 
     return Encode(file, Encoding.Default); 
    } 
相关问题