Преобразование проблемы в кодировке ANSI в utf8 с#

У меня проблема с преобразованием текстового файла из ANSI в UTF8 в c#. Я пытаюсь отобразить результаты в браузере.

Итак, у меня есть этот текстовый файл со многими символами акцента в нем. Его кодируется в ANSI, поэтому я должен преобразовать его в utf8, потому что в браузере вместо accentchars появляются "?". Независимо от того, как я пытался преобразовать в UTF8, это все еще было "?". Но если я преобразую текстовый файл в Notepad++ в utf8, то акцент чарс хорошие выполните.

здесь это мир кодирования кода, который я сделал:

    public string Encode(string text)
    {
        // encode the string as an ASCII byte array
        byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text);

        // convert the ASCII byte array to a UTF-8 byte array
        byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes);

        // reconstitute a string from the UTF-8 byte array 
        return UTF8Encoding.UTF8.GetString(myUTF8Bytes);
    }

у вас есть идеи, почему это происходит?

6 ответов


у вас есть идеи, почему это происходит?

Да, вы опоздали. Вам нужно указать ANSI при чтении строки из файла. В памяти это всегда Unicode (UTF16).


при преобразовании в ASCII вы сразу теряете все неанглийские символы (в том числе с акцентом), потому что ASCII имеет только 127 (7 бит) символов.

Вы делаете странные манипуляции. string в .net находится в UTF-16, поэтому, как только вы вернетесь string, а не byte[] это не имеет значения.

Я думаю, вы должны сделать: (я думаю, ANSI вы имеете в виду Latin1)

public byte[] Encode(string text)
{
    return Encoding.GetEncoding(1252).GetBytes(text);
}

поскольку вопрос был не очень понятно, есть резонное замечание, что вы могли бы на самом деле нужен этот:

public string Decode(byte[] data)
{
    return Encoding.GetEncoding(1252).GetString(data);
}

Это, вероятно, самый простой способ:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);

Я бы рекомендовал прочитать это http://www.joelonsoftware.com/articles/Unicode.html.
Если вы собираетесь прочитать файл ASCII, вам нужно знать кодовую страницу файла.


Это, вероятно, происходит потому, что ваш оригинал string text уже содержит недопустимые символы. Преобразование кодирования имеет смысл только в том случае, если ваш вход является массивом байтов. Итак, вы должны прочитать файл как массив байтов вместо строки или, как сказал Хенк, указать кодировку для чтения файла.


мои мысли здесь, когда вы сохраняете файл в Notepad++ он вставляет Byte-Order-Mark таким образом, браузер может сделать вывод, что это UTF8 из этого. В противном случае вам, вероятно, придется явно сообщить браузеру кодировку символов, как в DTD, в XML и т. д.