c#编码问题?

时间:2011-11-03 15:14:04

标签: c# encoding utf-8

我有一个输入:DisplaygröÃe

我希望输出如:Displaygröÿe

使用notepad ++问题解决了:转换为ansi,编码为u​​tf8并转换回ansi。

我需要在c#中以编程方式执行此操作。

我试过转换成ansi,utf8,latin-1并且没有正常工作,它表明了吗?使用Encoding.Default.GetBytes的函数,然后是 res = Enconding.Convert(src1,dest1,bytes)和
EncodingDest.GetChars(RES);
其中EncodingDest表示输出编码..

代码在控制台应用程序中运行,但WPF上的结果相同。 如果编码对输出有好处,那么这些问题也适用于像西班牙,意大利或瑞典这样的国家。

5 个答案:

答案 0 :(得分:2)

使用System.Text.Encoding

var ascii = Encoding.ASCII.GetBytes("DisplaygröÃe");
var utf8 = Encoding.Convert(Encoding.ASCII, Encoding.UTF8, ascii);
var output = Encoding.UTF8.GetString(utf8);

答案 1 :(得分:1)

在某处输出字符串(如TextWriterStreambyte[])时,除非您需要UTF-8输出,否则应始终指定编码(默认值):

using(StreamWriter sw = new StreamWriter("file.txt", Encoding.GetEncoding("windows-1252"))
    sw.WriteLine("Displaygröÿe");

答案 2 :(得分:1)

@DanM:您 需要 以了解您的输入所在的字符集。

“DisplaygröÃe”是你看到的字符串“Displaygröße”(由Vlad建议)将其编码为UTF-8的字节,然后错误地将其解码为latin1。

如果你对Displaygröÿe做同样的事情,你会看到“Displaygröÿe”(倒置的问号就在那里,它不是一个无法显示的占位符。)技术上,“Displaygrö” Ó可能在Ãe之间有另一个字符,但它是一个控制代码,因此对您来说是不可见的。

如果你有一个字符集foo,这是真的:my_string = foo_decode(foo_encode(my_string))。如果你有另一个字符集栏,那就是这样:barf = bar_decode(foo_encode(my_string)) barf就像你看到的那样是垃圾。

如果你不知道输入的字符集是什么,你只会偶然正确地解码它。

您的输入文件似乎是UTF-8,您需要从文件中解码字节。 (我不会说足够的C#来帮助你......我只会说字符编码。)

答案 3 :(得分:0)

using (var rdr = new StreamReader(fs, Encoding.GetEncoding(1252))) {
     result = rdr.ReadToEnd();
}

答案 4 :(得分:0)

我们在向文本打印机发送数据时遇到了类似的问题,我只有一个工作就是这个(写成扩展名):

    public static byte[] ToAnsiMemBytes(this string input)
    {
        int length = input.Length;
        byte[] result = new byte[length];

        try
        {
            IntPtr bytes = Marshal.StringToCoTaskMemAnsi(input);
            Marshal.Copy(bytes, result, 0, length);
        }
        catch (Exception)
        {
            result = null;
        }

        return result;
    }