5

我有一个 ANSI 编码的文件。但是,它在其中显示阿拉伯字母。这个文本文件是由某个程序生成的(我没有相关信息),但似乎有某种内部编码(如果我可以说,如果可能的话)让阿拉伯字母出现。

有这样的事吗?如果不是,ANSI 文件如何显示阿拉伯字母?

*如果可能的话用Java代码解释


01版

当我在 Notepad++ 中打开它时,它显示页面编码是 ANSI。请检查这张照片:

http://www.4shared.com/file/221862075/e8705951/text-Windows.html


02版

您可以从以下位置检查文件:

http://www.4shared.com/file/221853641/3fa1af8c/data.html

4

6 回答 6

4

你怎么知道它是ANSI编码的?如果它不是像 UTF-8 这样的多字节编码,我猜它是使用像这样的阿拉伯代码页编码的:Windows-1256

您可以在十六进制编辑器中查看文件并找出阿拉伯字符的数字,然后尝试找出创建它的编码/代码页。

于 2010-02-14T12:11:41.713 回答
4

简短回答:您的文本文件可能不是“ANSI”编码的,而是 utf-8。

长答案

首先,术语“ANSI”(在 Windows 上)并不意味着固定编码。它的含义取决于您的语言设置。例如,在西欧和美国,它通常是Windows-1252ISO/IEC 8859-1 的变体,也称为 latin-1),在日本,它是SHIft JIS,在阿拉伯国家,它是ISO/ IEC_8859-6

如果您使用的是非阿拉伯语版本的 Windows 并且没有更改您的语言设置,并且当您在记事本中打开文件时可以在文件中看到阿拉伯字母,那么它肯定不是这些 ANSI 编码中的任何一种。相反,它可能是Unicode

请注意,我不是指“UNICODE”,它在 Windows 上通常表示UTF-16LE。它也可以是 UTF-8。两者都是可以编码当前在 Unicode 中定义的所有 100.000+ 个字符的编码,但它们以不同的方式进行编码。两者都是可变长度编码,这意味着并非所有字符都使用相同的位数进行编码。

在 UTF-8 中,每个字符被编码为一到四个字节。已选择编码以使 ASCII 字符编码为一个字节。

在 UTF-16 中,每个字符都被编码为两个四个字节。这种编码最初是在 Unicode 的字符少于 64K 时发明的,因此可以将每个字符编码为单个 16 位字。后来,当明确 Unicode 必须超过 64K 限制时,发明了一种方案,其中 0xD800-0xDFFF 范围内的单词对用于表示前 64K(减去 0x800)字符之外的字符。

要查看文件中的实际内容,请在十六进制编辑器中打开它:

  • 如果前两个字节是 FF FE,那么很可能是 UTF-16LE(小端序)
  • 如果前两个字节是 FE FF,那么它可能是 UTF-16BE(大端,在 Windows 上不太可能)
  • 如果前三个字节是 EF BB BF,那么很可能是 UTF-8
  • 如果您看到很多 00 字节,则可能是 UTF-16(或 UTF-32,如果您看到成对的 00 字节)
  • 如果阿拉伯字符占据一个字节,则很可能是 ISO-8859-6(例如 ش 将是 D5)。
  • 如果阿拉伯字符占据多个字节,则很可能是 UTF-8(例如 ش 将是 D8 B4)。
于 2010-02-14T12:11:59.653 回答
4

有这样的事吗?

不。

如果不是,ANSI 文件如何显示阿拉伯字母?

它不是 Windows-ANSI 编码文件。更有可能的是,它使用可变宽度编码,最有可能是 UTF-8:UTF-8 中的许多常见字符位置等同于它们在 US-ASCII 中的位置(事实上,它就是这样设计的),并且通过推断也适用于Windows-ANSI。

编辑:我们必须感谢微软的这种混乱。“ANSI”在编码方面没有得到很好的说明。通常它代表 Windows 默认编码,代码页为 1252(“Windows-1252”),恰好对应于源自拉丁语的“西方”字母。

但是,在其他国家/地区,Windows 使用的默认编码(在较旧的 Windows 版本中……今天,默认为 UTF-8)不是Windows-1252,而是另一种编码,当时也称为“ANSI”。在这种情况下,代码页 1256。

于 2010-02-14T12:12:22.587 回答
3

我尝试在 Firefox 和 Opera 中打开该文件。我必须将字符编码设置为阿拉伯语 Windows-1256 以使其在两个浏览器中都能正确显示,因此文件的编码很可能就是这样。

注意:我最初将此作为评论发布,但被要求将其作为答案。

于 2010-02-14T12:40:06.843 回答
1

ANSI 字符编码允许 217 个字符并且不包含阿拉伯字母。我想也许该文件使用了另一种编码。

Anwsering 您的编辑,看来问题出在 Notepad++ 上,因为显示的内容显然超出了 ANSI 字符集的能力。

于 2010-02-14T12:14:00.230 回答
1

首先,我下载了您的文件并尝试使用 vim 检查其编码,但它似乎不知道,在第二台机器上它说latin1这可能与 notepad++ 中发生的情况相似(给出了通用答案)。
所以我做file data.txt了,输出是这样的:

data.txt: ISO-8859 text, with CRLF line terminators

希望这可以帮助。

编辑
使用浏览器的东西表明这个答案是不正确的。

ISO-8859-4 和 ISO-8859-13 可以显示文本,没有错误,但字符不是阿拉伯语。

于 2010-02-14T12:41:26.127 回答