【问题标题】:Four byte encoding of U+00F6 (LATIN SMALL LETTER O WITH DIAERESIS)?U+00F6 的四字节编码(带分音符号的拉丁文小写字母 O)?
【发布时间】:2010-04-23 19:11:32
【问题描述】:

哪个字符编码(或编码组合)将字符öU+00F6LATIN SMALL LETTER O WITH DIAERESIS 或简单地将chr(246) 放入 ISO-8859-1 中)表示为四个八位字节组合chr(195) . chr(63) . chr(194) . chr(164)

【问题讨论】:

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

标签: unicode utf-8 internationalization character-encoding


【解决方案1】:

This page 列出了该特定字符的所有各种二进制表示的相当全面的集合,它们中没有一个与您所拥有的更接近。您确定没有在文本编码之上进行其他转换吗?

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

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;
}

【讨论】:

  • 输入很可能被弄乱了,因为可能已经进行了多种编码:-\
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 2015-09-11
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2019-07-01
  • 2011-10-15
相关资源
最近更新 更多