2013-01-02 38 views
3

我试图读取一个文件,但我无法弄清楚字符编码。有迹象表明,我所知道的值在文件中两个字符,和十六进制值是我在十六进制编辑器看到的是如下:什么字符编码具有e作为0xCCA9的口音?

0xCCA9 é 
0xCCBB ê 
0xCCC1 á 

任何想法编码这是什么?

所有英文字符的ASCII文件中的编码。我有类似的文件,如果有任何用处,它们在中欧欧洲中部编码,也许它们被意外编码了一次以上。

编辑:

代码找到映射在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) 

回答

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 compatibe;排除了任何EBCDIC代码页
+0

斑点。我编写了一个程序来映射每个可用字符集以测试它是否符合这些条件,请参阅我的编辑。原来是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"); 
     } 
    } 
} 
+0

没有运气,我害怕。我也试过发誓它是ISO-8859-2的enca! – bcoughlan