带重音符的e在0xCCA9编码中使用了哪种字符编码?

3

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

0xCCA9  é
0xCCBB  ê
0xCCC1  á

你有什么想法,这是哪种编码方式?

文件中的所有英文字符都是ASCII编码的。我曾经有过类似的文件,它们是使用Mac Central Europe编码的,如果有用的话,也许它们被意外地编码了多次。

编辑:

在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个回答

3

它不是任何编码,而是混乱的编码转换结果。在UTF-8中将会是这样:

0xC3A9  é
0xC3AA  ê
0xC3A1  á

我认为最初发生的情况是,UTF-8数据在ASCII兼容的编码页X中处理,然后结果被编码到Mac中央欧洲文件中。

要获取原始数据,您需要使用Mac中央欧洲语言解读文件,将结果重新编码为代码页X,并使用UTF-8解读重新编码的结果。

我不知道代码页X是什么,但它必须具备以下属性,假设上述内容是正确的:

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

很好。我编写了一个程序来映射每个可用的字符集,以测试它们是否符合这些条件,请参见我的编辑。结果是 mac_roman 和 latin_1。 - bcoughlan

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

很抱歉,我没有成功。我也尝试了 enca,它声称是 ISO-8859-2! - bcoughlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接