如何使文本文件有多个编码?

时间:2010-02-14 12:07:42

标签: java encoding utf-8 ansi arabic

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

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

*如果可能,请在Java代码中解释


Edition 01

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

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


第02版

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

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

答案很长

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

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

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

在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(如果您看到00 BYtes对,则为UTF-32)
  • 如果阿拉伯字符占用一个字节,则可能是ISO-8859-6(例如Ô将是D5)。
  • 如果阿拉伯字符占用多个字节,则可能是UTF-8(例如Ô将是D8 B4)。

答案 2 :(得分:4)

  

有这样的事吗?

没有

  

如果没有,ANSI文件如何显示阿拉伯字母?

它不是Windows-ANSI编码的文件。更可能的是,它使用variable-width encoding,很可能是UTF-8:UTF-8中的许多常见字符位置等同于它们的位置在US-ASCII中(实际上,它是按照这种方式设计的),也是对Windows-ANSI的推断。

编辑:我们要感谢微软的这种困惑。在编码方面,“ANSI”没有明确规定。通常它代表Windows默认编码,代码页1252(“Windows-1252”),恰好对应于源自拉丁语的“西方”字母。

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

ANSI字符编码允许217个字符,不包含阿拉伯字母。我想也许该文件使用了替代编码。

对您的编辑进行测试,问题出现在Notepad ++上,因为显示的内容显然超出了ANSI字符集的功能。

答案 5 :(得分:1)

首先我下载了​​你的文件,并尝试使用vim来检查它的编码,它似乎不知道,并且在第二台机器上它说latin1这可能类似于记事本++中发生的事情(给出了通用接听)。
所以我做了file data.txt,输出是这样的:

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

希望这会有所帮助。

修改
使用浏览器的东西显示这个答案是不正确的。

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