我正在尝试读取文件,但我无法弄清楚字符编码。我知道文件中有两个字符的值,我在十六进制编辑器中看到的十六进制值如下:
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)
答案 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
答案 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");
}
}
}