3

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

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)
4

2 回答 2

3

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

0xC3A9  é
0xC3AA  ê
0xC3A1  á

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

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

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

  • 编码©0xA9; 与 Mac、Windows 和 ISO 编码相同
  • 编码Ő0xC3; 排除任何 DOS 代码页
  • 编码Ľ0xAA
  • 编码Ń0xA1
  • 是否兼容 ASCII;排除任何 EBCDIC 代码页
于 2013-01-03T15:20:09.420 回答
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");
        }
    }
}
于 2013-01-02T20:55:29.770 回答