代码之家  ›  专栏  ›  技术社区  ›  M. A. Kishawy Andy Guibert

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

  •  5
  • M. A. Kishawy Andy Guibert  · 技术社区  · 14 年前

    我有一个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

    6 回复  |  直到 14 年前
        1
  •  3
  •   Klarth    14 年前

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

    注: 我最初是作为评论发布的,但被要求做一个回答。

        2
  •  4
  •   Pekka    14 年前

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

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

        3
  •  4
  •   oefe    14 年前

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

    长回答 :

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

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

    注意,我不是指“unicode”,在Windows上通常是指 UTF-16LE .可能是 UTF-8 也。这两种编码都可以对当前用Unicode定义的所有100000多个字符进行编码,但它们的编码方式不同。两者都是 variable length encodings 也就是说,不是所有字符都使用相同的位数进行编码。

    在UTF-8中,每个字符编码为1到4个字节。已选择编码,以便将ASCII字符编码为一个字节。

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

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

    • 如果前两个字节是ff fe,那么它很可能是utf-16le(小endian)
    • 如果前两个字节是fe-ff,那么可能是utf-16be(big endian,在Windows上不太可能)
    • 如果前三个字节是ef bb bf,那么可能是utf-8
    • 如果你看到的是大量的00字节,那么很可能是UTF-16(或者UTF-32,如果你看到的是成对的00字节)
    • 如果阿拉伯字符占用一个字节,则很可能是ISO-8859-6(例如,_´将是d5)。
    • 如果阿拉伯字符占用多个字节,则可能是UTF-8(例如,_´将是D8 B4)。
        4
  •  4
  •   Konrad Rudolph    14 年前

    有这样的事吗?

    不。

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

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

    编辑 :对于这种混乱,我们必须感谢微软。__ansi_在编码方面没有很好地指定。通常,它代表代码页1252(__windows-1252_)的Windows默认编码,恰好对应于拉丁语派生的__western_字母。

    但是,在其他国家,Windows使用的默认编码(在旧版本的Windows中,现在默认为UTF-8)是 Windows-1252是一种不同的编码方式,也被称为ansi。在这种情况下,代码页1256。

        5
  •  1
  •   spender    14 年前

    ANSI字符编码允许217个字符,不包含阿拉伯字母。我想文件可能使用了另一种编码方式。

    在编辑过程中,似乎记事本存在问题,因为显示的内容明显超出了ansi字符集的能力。

        6
  •  1
  •   João Portela    14 年前

    首先,我下载了你的文件,并试图使用VIM检查它的编码,但它似乎不知道,在第二台机器上,它说 latin1 这可能与记事本+中发生的情况类似(给出了一般的答案)。
    所以我做到了 file data.txt 结果是:

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

    希望这有帮助。

    编辑 :
    使用浏览器显示这个答案是错误的。

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