Преобразование проблемы ANSI в UTF8 C # - PullRequest
8 голосов
/ 23 сентября 2010

У меня проблема с преобразованием текстового файла из 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 ]

16 голосов
/ 23 сентября 2010

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

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

7 голосов
/ 23 сентября 2010

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

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

Я думаю, что вы должны сделать:)

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

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

public string Decode(byte[] data)
{
    return Encoding.GetEncoding(1252).GetString(data);
}
6 голосов
/ 15 октября 2012

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

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);
1 голос
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

...