Unicode U+的四字节编码;00F6(带分音符的拉丁文小写字母O)?

Unicode U+的四字节编码;00F6(带分音符的拉丁文小写字母O)?,unicode,utf-8,internationalization,character-encoding,Unicode,Utf 8,Internationalization,Character Encoding,哪个字符编码(或编码组合)表示字符O(U+00F6,带分音符的拉丁文小写字母O,或者简单地说ISO-8859-1中的chr(246))作为四个八位组的组合chr(195)。chr(63)。chr(194)。chr(164)?列出了该特定字符的所有各种二进制表示形式的相当全面的集合,其中没有一种更接近您所拥有的。您确定在文本编码的基础上没有其他转换吗 如果您认为数据可能已被多次编码,请尝试以下操作: public static IEnumerable<Encoding> FindEnc

哪个字符编码(或编码组合)表示字符
O
U+00F6
带分音符的拉丁文小写字母O
,或者简单地说ISO-8859-1中的
chr(246)
)作为四个八位组的组合
chr(195)。chr(63)。chr(194)。chr(164)

列出了该特定字符的所有各种二进制表示形式的相当全面的集合,其中没有一种更接近您所拥有的。您确定在文本编码的基础上没有其他转换吗

如果您认为数据可能已被多次编码,请尝试以下操作:

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;
}
公共静态IEnumerable FindEncodingPath(char desiredChar,byte[]数据)
{
返回FindEncodingPath(新字符[]{desiredChar},数据,5);
}
私有静态IEnumerable FindEncodingPath(char[]desiredChar,byte[]data,int iterationsleet)
{
列表编码=空;
foreach(Encoding.GetEncodings()中的enc编码)
{
byte[]temp=enc.GetBytes(desiredChar);
布尔匹配=假;
如果(临时长度==数据长度)
{
匹配=真;
for(int i=0;i0)
{
IEnumerable tempEnc=FindEncodingPath(desiredChar、temp、iterationsleet-1);
if(tempEnc!=null)
{
编码=新列表();
编码。添加(enc);
AddRange(tempEnc);
打破
}
}
}
返回编码;
}

我敢打赌没有。你确定没有弄错什么吗?leonbloy:输入很可能会弄错,因为已经进行了多次编码。是的,但是,你确定四个字节的序列与U+00F6字符完全对应(不多也不少)?您可以看到,chr(195)和chr(194)是典型的UTF-8编码,但它们后面的字节大于127。
chr(63)
0x3F
)是
字符,这通常表示数据可能已通过不兼容的字符集转换,并因此丢失。输入可能会非常混乱,因为可能进行了多次编码:-\