Четырехбайтовая кодировка U + 00F6 (LATIN SMALL LETTER O WITH DIAERESIS)? - PullRequest
0 голосов
/ 23 апреля 2010

Какая кодировка символов (или комбинации кодировок) представляет символ ö (U+00F6, LATIN SMALL LETTER O WITH DIAERESIS или, проще говоря, chr(246) в ISO-8859-1) как комбинацию из четырех октетов chr(195) . chr(63) . chr(194) . chr(164)?

1 Ответ

2 голосов
/ 23 апреля 2010

На этой странице перечислены довольно полные наборы всех различных двоичных представлений этого конкретного символа, и ни одно из них даже близко не соответствует вашему. Вы уверены, что поверх кодировки текста не выполняется какое-либо другое преобразование?

Если вы считаете, что данные могли быть закодированы несколько раз, попробуйте следующее:

public static IEnumerable<Encoding> FindEncodingPath(char desiredChar, byte[] data)
{
    return FindEncodingPath(new char[] { desiredChar }, data, 5);
}

private static IEnumerable<Encoding> FindEncodingPath(char[] desiredChar, byte[] data, int iterationsLeft)
{
    List<Encoding> encodings = null;

    foreach(Encoding enc in Encoding.GetEncodings())
    {
        byte[] temp = enc.GetBytes(desiredChar);

        bool match = false;

        if(temp.Length == data.Length)
        {
            match = true;

            for(int i = 0; i < data.Length; i++) 
            {
                if(data[i] != temp[i])
                {
                    match = false;
                    break;
                }
            }
        }

        if(match)
        {
            encodings = new List<Encoding>();

            encodings.Add(enc);

            break;
        }
        else if(iterationsLeft > 0)
        {
            IEnumerable<Encoding> tempEnc = FindEncodingPath(desiredChar, temp, iterationsLeft - 1);

            if(tempEnc != null)
            {
                encodings = new List<Encoding>();

                encodings.Add(enc);
                encodings.AddRange(tempEnc);

                break;
            }
        }
    }

    return encodings;
}
...