一种JAVA文件及字节流的编码格式的判断方法及装置与流程

文档序号:12463455阅读:381来源:国知局
一种JAVA文件及字节流的编码格式的判断方法及装置与流程

本发明涉及数据处理领域,尤其涉及一种编码格式的判断方法,具体的讲是一种JAVA文件及字节流的编码格式的判断方法及装置。



背景技术:

本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。

内存中的字符串不仅仅局限于从class代码中直接加载而来的字符串,还有一些字符串是从文本文件中读取的,还有的是通过数据库读取的,还有可能是从字节数组构建的,然而他们基本上都不是Unicode编码的,原因很简单,为了存储优化。

因此就需要处理各种各样的编码问题,在处理之前,必须明确“源”的编码,然后用指定的编码方式正确读取到内存中。

目前流行的判断文件和字节流的编码格式的方法为判断文件流所有的字节的编码范围和字节流所有的编码范围,存在工作量大、程序复杂、容易出错的缺陷。



技术实现要素:

本发明实施例采用Unicode的编码规则来判断文件和字节流的编码格式,以解决现有的判断方法工作量大且容易出错的问题。

为了达到上述目的,本发明实施例提供一种JAVA文件及字节流的编码格式的判断方法,包括:读取文件或字节流的前四个字节;根据Unicode编码规则以及所述文件或字节流的前四个字节,判断所述文件或字节流的编码格式。

进一步地,在一实施例中,所述根据Unicode编码规则以及所述文件的前四个字节,判断所述文件的编码格式,具体包括:

如果第1个字节为-1,并且第2个字节为-2,则编码格式为UTF-16;

如果第1个字节为-2,并且第2个字节为-1,则编码格式为Unicode;

如果第1个字节为-17,并且第2个字节为-69,并且第3个字节为-65,则编码格式为UTF-8。

进一步地,在一实施例中,如果判定为编码格式为Unicode,则返回文件的编码格式为UTF-16。

进一步地,在一实施例中,所述根据Unicode编码规则以及所述字节流的前四个字节,判断所述字节流的编码格式,具体包括:

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf7,同时第二个新字节iTail>=0xa1和iTail<=0xfe,根据Unicode编码规则,此字节流为GB2312;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0x81并且iHead<=0xf7,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0x80和iTail<=0xfe),根据Unicode编码规则,此字节流为GBK;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf9,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0xa1和iTail<=0xfe),根据Unicode编码规则,此字节流为BIG5;

将第1个字节head和第2个字节tail2与0xff取与操作得到iHead和iTail2,如果第一个新字节iHead>=0x81并且iHead<=0xf9,同时第二个新字节(iTail2>=0x40和iTail2<=0x7e)或(iTail2>=0xa1和iTail2<=0xfe),第三个新字节(iTail3>=0x40和iTail3<=0x7e)或(iTail3>=0xa1和iTail3<=0xfe),第四个新字节(iTail4>=0x40和iTail4<=0x7e)或(iTail2>=0xa1和iTail4<=0xfe),根据Unicode编码规则,此字节流为UTF8。

进一步地,在一实施例中,还包括:

通过判断字节流的编码格式来判断字符串的编码格式,具体包括:

设定未知编码格式的原字符串的编码格式为某一编码格式;

将所述原字符串转化为编码格式为所述设定的编码格式的字节流,然后将编码格式为设定的编码格式的字节流转换为新字符串,将所述原字符串与新字符串比较,如果两个字符串相同,则所述原字符串的编码格式为设定的编码格式。

为了达到上述目的,本发明实施例还提供一种JAVA文件及字节流的编码格式的判断装置,包括:字节读取模块,用于读取文件或字节流的前四个字节;判断模块,用于根据Unicode编码规则以及所述文件或字节流的前四个字节,判断所述文件或字节流的编码格式。

进一步地,在一实施例中,所述判断模块根据Unicode编码规则以及所述文件的前四个字节,判断所述文件的编码格式,具体包括:

如果第1个字节为-1,并且第2个字节为-2,则编码格式为UTF-16;

如果第1个字节为-2,并且第2个字节为-1,则编码格式为Unicode;

如果第1个字节为-17,并且第2个字节为-69,并且第3个字节为-65,则编码格式为UTF-8。

进一步地,在一实施例中,如果判定为编码格式为Unicode,则返回文件的编码格式为UTF-16。

进一步地,在一实施例中,所述判断模块根据Unicode编码规则以及所述字节流的前四个字节,判断所述字节流的编码格式,具体包括:

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf7,同时第二个新字节iTail>=0xa1和iTail<=0xfe,根据Unicode编码规则,此字节流为GB2312;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0x81并且iHead<=0xf7,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0x80和iTail<=0xfe),根据Unicode编码规则,此字节流为GBK;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf9,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0xa1和iTail<=0xfe),根据Unicode编码规则,此字节流为BIG5;

将第1个字节head和第2个字节tail2与0xff取与操作得到iHead和iTail2,如果第一个新字节iHead>=0x81并且iHead<=0xf9,同时第二个新字节(iTail2>=0x40和iTail2<=0x7e)或(iTail2>=0xa1和iTail2<=0xfe),第三个新字节(iTail3>=0x40和iTail3<=0x7e)或(iTail3>=0xa1和iTail3<=0xfe),第四个新字节(iTail4>=0x40和iTail4<=0x7e)或(iTail2>=0xa1和iTail4<=0xfe),根据Unicode编码规则,此字节流为UTF8。

进一步地,在一实施例中,所述判断模块还用于通过判断字节流的编码格式来判断字符串的编码格式,其具体包括:

设定未知编码格式的原字符串的编码格式为某一编码格式;

将所述原字符串转化为编码格式为所述设定的编码格式的字节流,然后将编码格式为设定的编码格式的字节流转换为新字符串,将所述原字符串与新字符串比较,如果两个字符串相同,则所述原字符串的编码格式为设定的编码格式。

本发明实施例的JAVA文件及字节流的编码格式的判断方法及装置,根据Unicode编码规则来判断文件和字节流的编码格式,具有工作量小、程序简洁、判断准确的优点。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例的JAVA文件及字节流的编码格式的判断装置的处理流程图;

图2为本发明实施例的JAVA文件及字节流的编码格式的判断装置的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本领域技术技术人员知道,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。

下面参考本发明的若干代表性实施方式,详细阐释本发明的原理和精神。

本发明的原理是:根据Unicode编码规则来判断文件和字节流的编码格式的,相对于现有的判断文件流所有的字节的编码范围和字节流所有的编码范围的判断方法,工作量小,判断准确。

图1为本发明实施例的JAVA文件及字节流的编码格式的判断方法的处理流程图。如图所示,包括:步骤S101,读取文件或字节流的前四个字节;步骤S102,根据Unicode编码规则以及所述文件或字节流的前四个字节,判断所述文件或字节流的编码格式。

首先,本发明中,Unicode编码规则如下:

1)ANSI:文件的编码就是两个字节“D1CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。

2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。

4)UTF-8:编码是六个字节“EF BB BF E4B8A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。

实施例一:

根据Unicode编码规则以及所述文件的前四个字节,判断所述文件的编码格式,具体步骤包括:

1)得到当前操作系统运行环境的编码格式:

String dc=Charset.defaultCharset().name();

2)将输入流转化为Unicode输入流:

UnicodeInputStream uin=new UnicodeInputStream(in,dc);

3)读取文件流的前个字节:

byte[]head=new byte[4];

in.read(head);

4)定义编码格式为GBK:

String code="GBK";

5)根据Unicode编码规则判断,如果第1个字节为-1,并且第2个字节为-2,则编码格式为UTF-16:

if(head[0]==-1&&head[1]==-2)

code="UTF-16";

6)根据Unicode编码规则判断,如果第1个字节为-2,并且第2个字节为-1,则编码格式为Unicode:

if(head[0]==-2&&head[1]==-1)

code="Unicode";

7)根据Unicode编码规则判断,如果第1个字节为-17,并且第2个字节为-69并且第3个字节为-65,则编码格式为UTF-8:

if(head[0]==-17&&head[1]==-69&&head[2]==-65)

code="UTF-8";

在步骤6)中,如果编码格式为Unicode,则返回文件的编码格式为UTF-16;因此最后返回文件的编码格式为GBK/UTF-8/UTF-16三种中的一种。

该实施例中,判断所述文件的编码格式的代码实现如下:

实施例二:

所述根据Unicode编码规则以及所述字节流的前四个字节,判断所述字节流的编码格式,其具体实现方法为:

1)判断字节流是否为GB2312编码,得到byte[]字节流的前两个字节,将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf7,同时第二个新字节iTail>=0xa1和iTail<=0xfe,根据Unicode编码规则,此字节数组为GB2312。

2)判断字节流是否为GBK编码,得到byte[]字节流的前两个字节,将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0x81并且iHead<=0xf7,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0x80和iTail<=0xfe),根据Unicode编码规则,此字节数组为GBK。

3)判断字节流是否为BIG5编码,得到byte[]字节流的前两个字节,将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf9,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0xa1和iTail<=0xfe),根据Unicode编码规则,此字节数组为BIG5。

4)判断字节流是否为UTF-8编码,得到byte[]字节流的前4个字节,将第1个字节head和第2个字节tail2与0xff取与操作得到iHead和iTail2,如果第一个新字节iHead>=0x81并且iHead<=0xf9,同时第二个新字节(iTail2>=0x40和iTail2<=0x7e)或(iTail2>=0xa1和iTail2<=0xfe),第三个新字节(iTail3>=0x40和iTail3<=0x7e)或(iTail3>=0xa1和iTail3<=0xfe),第四个新字节(iTail4>=0x40和iTail4<=0x7e)或(iTail2>=0xa1和iTail4<=0xfe),根据Unicode编码规则,此字节数组为UTF8。

该实施例中,判断所述字节流的编码格式的代码实现如下:

实施例三:

本发明的JAVA文件及字节流的编码格式的判断方法还包括通过判断字节流的编码格式来判断字符串的编码格式,具体包括:设定未知编码格式的原字符串的编码格式为某一编码格式;将所述原字符串转化为编码格式为所述设定的编码格式的字节流,然后将编码格式为设定的编码格式的字节流转换为新字符串,将所述原字符串与新字符串比较,如果两个字符串相同,则所述原字符串的编码格式为设定的编码格式。

具体实施时,判断字符串的编码规则是在判断字节流的编码规则上进行的,功能如下:

1)首先设定未知编码格式的原字符串A的编码格式为GB2312。

2)将原字符串A转化为假设编码格式为GB2312的byte[]字节流,然后将编码格式为GB2312的byte[]字节流转换为字符串B,如果原字符串A与根据编码格式为GB2312的字符串B比较,如果两个字符串相同,则原字符串A的编码格式为GB2312。

3)然后设定未知编码格式的原字符串A的编码格式为ISO-8859-1。

4)将原字符串A转化为假设编码格式为ISO-8859-1的byte[]字节流,然后将编码格式为ISO-8859-1的byte[]字节流转换为字符串B,如果原字符串A与根据编码格式为ISO-8859-1的字符串B比较,如果两个字符串相同,则原字符串A的编码格式为ISO-8859-1。

5)然后设定未知编码格式的原字符串A的编码格式为UTF-8。

6)将原字符串A转化为假设编码格式为UTF-8的byte[]字节流,然后将编码格式为UTF-8的byte[]字节流转换为字符串B,如果原字符串A与根据编码格式为UTF-8的字符串B比较,如果两个字符串相同,则原字符串A的编码格式为UTF-8。

7)然后设定未知编码格式的原字符串A的编码格式为GBK。

8)将原字符串A转化为假设编码格式为GBK的byte[]字节流,然后将编码格式为GBK的byte[]字节流转换为字符串B,如果原字符串A与根据编码格式为GBK的字符串B比较,如果两个字符串相同,则原字符串A的编码格式为GBK。

9)然后设定未知编码格式的原字符串A的编码格式为BIG5。

10)将原字符串A转化为假设编码格式为BIG5的byte[]字节流,然后将编码格式为BIG5的byte[]字节流转换为字符串B,如果原字符串A与根据编码格式为BIG5的字符串B比较,如果两个字符串相同,则原字符串A的编码格式为BIG5。

代码参见:

该实施例中,判断所述字符串的编码格式的代码实现如下:

应当注意,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。

在介绍了本发明示例性实施方式的方法之后,接下来,参考图2对本发明示例性实施方式的JAVA文件及字节流的编码格式的判断装置进行介绍。该装置的实施可以参见上述方法的实施,重复之处不再赘述。以下所使用的术语“模块”和“单元”,可以是实现预定功能的软件和/或硬件。尽管以下实施例所描述的模块较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

图2为本发明实施例的JAVA文件及字节流的编码格式的判断装置的结构示意图。如图2所示,包括:

字节读取模块101,用于读取文件或字节流的前四个字节;

判断模块102,用于根据Unicode编码规则以及所述文件或字节流的前四个字节,判断所述文件或字节流的编码格式。

在本实施例中,所述判断模块102根据Unicode编码规则以及所述文件的前四个字节,判断所述文件的编码格式,具体包括:

如果第1个字节为-1,并且第2个字节为-2,则编码格式为UTF-16;

如果第1个字节为-2,并且第2个字节为-1,则编码格式为Unicode;如果判定为编码格式为Unicode,则返回文件的编码格式为UTF-16;

如果第1个字节为-17,并且第2个字节为-69,并且第3个字节为-65,则编码格式为UTF-8。

在本实施例中,所述判断模块102根据Unicode编码规则以及所述字节流的前四个字节,判断所述字节流的编码格式,具体包括:

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf7,同时第二个新字节iTail>=0xa1和iTail<=0xfe,根据Unicode编码规则,此字节流为GB2312;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0x81并且iHead<=0xf7,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0x80和iTail<=0xfe),根据Unicode编码规则,此字节流为GBK;

将第1个字节head和第2个字节tail与0xff取与操作得到iHead和iTail,如果第一个新字节iHead>=0xa1并且iHead<=0xf9,同时第二个新字节(iTail>=0x40和iTail<=0x7e)或(iTail>=0xa1和iTail<=0xfe),根据Unicode编码规则,此字节流为BIG5;

将第1个字节head和第2个字节tail2与0xff取与操作得到iHead和iTail2,如果第一个新字节iHead>=0x81并且iHead<=0xf9,同时第二个新字节(iTail2>=0x40和iTail2<=0x7e)或(iTail2>=0xa1和iTail2<=0xfe),第三个新字节(iTail3>=0x40和iTail3<=0x7e)或(iTail3>=0xa1和iTail3<=0xfe),第四个新字节(iTail4>=0x40和iTail4<=0x7e)或(iTail2>=0xa1和iTail4<=0xfe),根据Unicode编码规则,此字节流为UTF8。

在本实施例中,所述判断模块102还用于通过判断字节流的编码格式来判断字符串的编码格式,其具体包括:

设定未知编码格式的原字符串的编码格式为某一编码格式;将所述原字符串转化为编码格式为所述设定的编码格式的字节流,然后将编码格式为设定的编码格式的字节流转换为新字符串,将所述原字符串与新字符串比较,如果两个字符串相同,则所述原字符串的编码格式为设定的编码格式。

此外,尽管在上文详细描述中提及了JAVA文件及字节流的编码格式的判断装置的若干单元,但是这种划分仅仅并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。同样,上文描述的一个单元的特征和功能也可以进一步划分为由多个单元来具体化。

本发明实施例的JAVA文件及字节流的编码格式的判断方法及装置,根据Unicode编码规则来判断文件和字节流的编码格式,具有工作量小、程序简洁、判断准确的优点。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1