什么字符编码的重音为0xCCA9?

时间:2013-01-02 20:32:11

标签: encoding character-encoding

我正在尝试读取文件,但我无法弄清楚字符编码。我知道文件中有两个字符的值,我在十六进制编辑器中看到的十六进制值如下:

0xCCA9  é
0xCCBB  ê
0xCCC1  á

有什么想法对此进行编码?

所有英文字符都在文件中进行ASCII编码。我有类似的文件,这些文件在mac中欧编码,如果它有用,也许它们被意外编码不止一次。

修改

在Python 2.7中查找映射的代码:(参见上面的Esailija答案)。

find_mappings(...)是一个生成器,它被赋予一个字符映射字典。它遍历所有可用的字符集,并产生符合条件的字符集。

import pkgutil
import encodings

def get_encodings():
    false_positives = set(["aliases"])
    found = set(name for imp, name, ispkg in pkgutil.iter_modules(encodings.__path__) if not ispkg)
    found.difference_update(false_positives)
    return found

def find_mappings(maps):
    encodings = sorted(get_encodings())
    for f in encodings:
        for g in encodings:
            try:
                if all([k.decode(f).encode(g) == v for k,v in maps.items()]):
                    yield (f,g)
            except:
                # Couldn't encode/decode
                pass

for mapping in find_mappings({'\xCC': '\xC3', '\xBB': '\xAA', '\xA9': '\xA9', '\xC1': '\xA1'}):
    print(mapping)

2 个答案:

答案 0 :(得分:3)

它不是任何编码,而是编码转换混乱的结果。它在UTF-8中的表现如何:

0xC3A9  é
0xC3AA  ê
0xC3A1  á

所以我认为最初发生的是UTF-8数据在ASCII兼容代码页X中处理,然后结果被编码到Mac Central Europe的文件中。

要获取原始数据,您将在Mac Central Europe中解释该文件,在代码页X中重新编码结果,并以UTF-8解释重新编码的结果。

我不知道代码页X是什么,但它必须具有以下属性,因为上述情况属实:

  • ©编码为0xA9;与Mac,Windows和ISO编码相同
  • Ő编码为0xC3;排除任何DOS代码页
  • Ľ编码为0xAA
  • Ń编码为0xA1
  • ASCII兼容;排除任何EBCDIC代码页

答案 1 :(得分:2)

在我的电脑中没有映射到这些字符的编码,但您可以尝试使用以下程序,这应该告诉您是否有任何匹配的编码:

public class StackOverflow_14128729
{
    public static void Test()
    {
        string expectedString = "éêá";
        byte[] dataBigEndian = new byte[] { 0xCC, 0xA9, 0xCC, 0xBB, 0xCC, 0xC1 };
        byte[] dataLittleEndian = new byte[] { 0xA9, 0xCC, 0xBB, 0xCC, 0xC1, 0xCC };
        byte[] shortData = new byte[] { 0xA9, 0xBB, 0xC1 };
        bool found = false;
        foreach (var encodingInfo in Encoding.GetEncodings())
        {
            Encoding encoding = encodingInfo.GetEncoding();
            foreach (var data in new byte[][] { dataLittleEndian, dataBigEndian, shortData })
            {
                try
                {
                    string str = encoding.GetString(data);
                    if (str == expectedString)
                    {
                        Console.WriteLine("Encoding is {0} - {1} - {2}", encodingInfo.CodePage, encodingInfo.Name, encodingInfo.DisplayName);
                        found = true;
                        break;
                    }
                }
                catch (Exception)
                {
                    // not this one, try next
                }
            }

            if (found)
            {
                break;
            }
            else
            {
                byte[] bytes = encoding.GetBytes(expectedString);
                string byteString = string.Join(" ", bytes.Select(b => string.Format("0x{0:X2}", (int)b)));
                //Console.WriteLine("{0} - {1}", encodingInfo.CodePage, byteString);
            }
        }

        if (!found)
        {
            Console.WriteLine("Encoding not found");
        }
    }
}