asp.net преобразует файл iso-8859 в utf-8 - PullRequest
1 голос
/ 22 апреля 2009

Мне нужно преобразовать файл CSV из iso в UTF-8, чтобы сохранить акценты в базе данных.

Французские акценты (é, è, ê и т. П.) Не сохраняются при попытке перевести их на UTF-8, они меняются на «?».

Я в тупике.

Я использую следующую функцию для перевода:

public static string iso8859ToUnicode(string src) {

        Encoding iso = Encoding.GetEncoding("iso8859-1");

        Encoding unicode = Encoding.UTF8;        

        byte[] isoBytes = iso.GetBytes(src);

        byte[] unibytes = Encoding.Convert(iso,unicode,isoBytes);

        char[] unichars = new char[iso.GetCharCount(unibytes,0,unibytes.Length)];

        unicode.GetChars(unibytes,0,unibytes.Length,unichars,0);

        return new string(unichars);

    }

Но, похоже, это плохо работает. Помощь

Ответы [ 3 ]

5 голосов
/ 22 апреля 2009

Я сильно подозреваю, что ваша исходная строка не имеет правильных значений. Я предполагаю, что вы прочитали его из файла, как если бы это был UTF-8.

Чтобы выполнить преобразование между двумя кодировками, вы не должны иметь строку в первую очередь - вы должны в основном загрузить байт файла и вызвать Encoding.Convert() таким образом. Либо загрузите файл, используя ISO-Latin-1, и просто сохраните его как UTF-8. Например:

public static void ConvertLatin1ToUtf8(string inputFile, string outputFile)
{
    Encoding latin1 = Encoding.GetEncoding(28591);
    string text = File.ReadAllText(inputFile, latin1);
    File.WriteAllText(outputFile, text, Encoding.UTF8);
}

или

public static void ConvertLatin1ToUtf8(string inputFile, string outputFile)
{
    Encoding latin1 = Encoding.GetEncoding(28591);
    byte[] latinBytes = File.ReadAllBytes(inputFile);
    byte[] utf8Bytes = Encoding.Convert(latin1, Encoding.UTF8, latinBytes);
    File.WriteAllBytes(outputFile, utf8Bytes);
}
0 голосов
/ 22 апреля 2009

Вместо метода GetChars() вы не можете просто вызвать

unicode.GetString(unibytes);
0 голосов
/ 22 апреля 2009

вы можете потерять кодировку при объявлении новой строки или при сохранении данных в массиве char

...