3

ファイルを読み込もうとしていますが、文字エンコードがわかりません。ファイルには値がわかっている2つの文字があり、16進エディターに表示される16進値は次のとおりです。

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で処理され、その結果がMacCentralEuropeのファイルにエンコードされたということでした。

元のデータを取得するには、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 に答える