什么代码页将 'ç' 编码为 '?º' (0x3f 0xba)?

6
今天我收到了一份客户发送的文件,需要阅读,但是里面包含了奇怪的字符。通过已知的名称,我可以猜测一些字符的意思。
例如:
Realname  | Encoded as   | sign  | hex
----------|--------------|-------|-------
Françios  | Fran?ºios    | ç     | 3f ba
André     | Andr??       | é     | 3f 3f
Hélène    | H??l?¿ne     | è     | 3f bf
etc.
  • 我已经尝试了所有在.Net中已知的代码页来导入文件,并查看其中是否包含我所知道的单词。但没有一个代码页能让我满意。
  • 在Notepad++中打开该文件会认为它是ANSI编码,并显示出不需要的字符。(但它有一个十六进制编辑器插件,很有用)。
  • 其他文件(来自同一用户和zip文件)采用的是UTF-8编码。

从我收到文件的人那里,我不能指望得到帮助。(使用谷歌翻译)他明确告诉我,他只是难以创建这些文件,并且他正在使用我无法访问的软件(我相信是SAP)。

除此之外,还有其他的方法可以找到他刚刚发送给我的文件的编码吗?


Notepad++显示该文件是什么格式?请查看右下角。UNICODE、ANSI、UTF-8,以及字符集是什么? - balexandre
Notepad++认为它是ANSI编码。但是ANSI编码不包含超过7F的字符(我被告知过)。ba和bf肯定更大。 - GvS
你需要再次请求该文件,使用UTF-8或UNICODE编码。你说他使用软件,所以我相信他在某个地方有这个选项... - balexandre
他来自哪里?他可能(不知情地)使用了默认的代码页。 - xanatos
1
@balexanre:我现在正在尝试。 (太糟糕了,他只会说法语,而且认为Unicode是某种独角兽)。但我也想知道他是如何获得这种奇怪的编码的。 - GvS
1
我怀疑你只能识别所有特殊情况并手动搜索替换它们。几乎所有(如果不是全部)的代码页面都保留了ASCII部分0-7F,因此我无法想象任何人会有意将重音编码为问号序列。 - Rup
2个回答

6
如果我取UTF-8编码的文本,假装它是CP850,然后将其转换为Latin-1Windows-1252或类似编码,我就可以得到那些结果。其中的"?"来自于CP850字符0xc3处的"├",而这在Latin-1或派生编码中不存在,因此转换会用"?"替换它。

编辑:我使用iconv进行了更广泛的搜索,发现CP437CP862CP865比CP850更匹配。既然你问了,这次我使用的一行命令是:

for enc in `iconv -l`; do echo -n "$enc: "; echo -n "ç é è" | iconv -s -f $enc -t "LATIN1//TRANSLIT" 2>/dev/null; echo; done

你是如何进行这个转换的?是写了一个小应用程序还是使用了一些软件? - GvS
我匆忙写了一个PHP脚本,对“ç”进行了mb_convert_encoding,以查找在将每个编码从mb_list_encodings转换为UTF-8时可能产生涉及“º”的结果。这指向了CP850,然后我想到“?”可能来自于转换为Latin-1或其他比Unicode更有限的编码。虽然CP850到Latin1不是完美的答案,但它将“é”作为“?®”而不是“??”。 - Anomie

1

应该使用UTF-8或UTF-16编码。 它们包含几乎所有常规字符。 看起来你有一个解码/编码问题。

Notepad++可能会感到困惑,因为你的文件没有使用字节顺序标记。

你如何处理你的文件?

尝试以二进制方式读取它们,然后尝试不同的编码方式来获取字符串。 如果你不以二进制方式读取它们,可能会发生默认编码。

"?"是这个问题的标志。

也许这个链接可以帮助解决问题。


我已经尝试了 .Net 知道的每个代码页。我只是想知道还有没有其他的? - GvS

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