`
andy_tj
  • 浏览: 1254 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

Flex 识别文件编码

阅读更多
这是一篇转帖共同学习共同讨论
两天前看到你这个问题,那个时候我也一样遇到了,本打算等有大侠来解决的,结果等到花都谢了,废话少说,说说我这几天调研的结果:



1.少数编辑器,比如记事本、Eclipse等,会在保存utf-8编码的文件时,在文件头加上BOM标记。就是网上说的那种方法。


2.有的编辑器,比如Editplus,默认编码是UTF-8,对于未标记的BOM头,就认为是UTF-8的。当然,这个也和编辑器的设置有关系。所以,有的没有BOM头的文件,在记事本中看到的编码是ANSI,而在Editplus等编辑器中看到的是UTF-8


3.关于这个问题,没有特别完美的解决方案,任何编辑器都会面临这个问题,也都没有完美方案,这点是肯定的。因为文件的编码并不是文件的某种属性,文件本身存储的时候只是二进制串,程序完全可以无视BOM头的“潜规则”而把它当做一个想当然的编码文本来解读。


4.说了这么多,上我的代码。这不是我写的,是找到java的方案来移植的:
01.var file:File = e.target as File;

02.var fs:FileStream = new FileStream();

03.var charset:String = File.systemCharset;

04.fs.open(file, FileMode.READ);

05.var bytes:ByteArray = new ByteArray();

06.fs.readBytes(bytes, 0, file.size);

07.if(bytes[0] === 0xff && bytes[1] === 0xfe){

08.        charset = 'unicode';

09.} else if(bytes[0] === 0xfe && bytes[1] === 0xff){

10.        charset = 'UTF-16BE';

11.} else if(bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf){

12.        charset = 'UTF-8';

13.} else {

14.        //从这里开始,就是你可能没看到的解决方案。

15.        var read:uint;

16.        for(var i:int = 0, len:int = bytes.length; i < len; i++){

17.                read = bytes[i];

18.                if(read >= 0xf0) {

19.                        charset = 'GBK';

20.                        break;

21.                }

22.                if(0x80 <= read && read <= 0xbf) {

23.                        charset = 'GBK';

24.                        break;

25.                }

26.                if(0xc0 <= read && read <= 0xdf){

27.                        read = bytes[++i];

28.                        if(0x80 <= read && read <= 0xbf)

29.                                continue;

30.                        else {

31.                                charset = 'GBK';

32.                                break;

33.                        }

34.                } else if(0xe0 <= read && read <= 0xef){

35.                        read = bytes[++i];

36.                        if(0x80 <= read && read <= 0xbf) {

37.                                read = bytes[++i];

38.                                if(0x80 <= read && read <= 0xbf) {

39.                                        charset = 'UTF-8';

40.                                        break;

41.                                } else {

42.                                        charset = 'GBK';

43.                                        break;

44.                                }

45.                        } else {

46.                                charset = 'GBK';

47.                                break;

48.                        }

49.                }

50.        }

51.}
复制代码相信这段代码的前半部分你很熟悉了,后面,是我找到的java某程序的实现思路,判断整个序列中是否有GBK编码的某些特征序列。类词法分析,效率还是可以接受的。此方法基本上对于几种常用的编码基本上都涵盖了。


5.咨询了一些客户端的同学,还有一种思路仅供参考,就是判断形如ANSI -> Unicode -> ANSI这种转换,通过判断转后得到的ANSI序列和转换前的是否一致来决定这个文件是不是ANSI编码的,诚如你所料,这需要一个白名单,然后根据名单,按图索骥的把所有编码二次转码的试一遍。直到成功match。当然,你也可以使用一个默认的编码格式,优先对照,并将剩余的编码做个按概率排序,性能会有提示。


6.总结:根据这些猥琐的方法和这几天的调研,判断文件编码不是一件十分靠谱的事,不可能完美,软件要做的就是尽可能的“智能”匹配出编码,实现这个目的,有这么几种思路:




1.判断BOM头,虽然这也不精确,比如“联通问题”,但挺方便。


2.判断是否存在只有特定编码才有的16进制序列,就好像我上面代码注释后面给出的部分一样。


3.做二次转码,黑盒测试,比对转码前和转码后。


4.如果以上三种方法还有漏网之鱼,就给个输入框,让用户自己填这个神秘又该死的编码吧。

  

//var bytes:ByteArray = new ByteArray;   
//filestream.readBytes(bytes,0,file.size);   
// 读取不同 编码的文档   
private function transEncodingText(bytes:ByteArray):String   
{   
	var str:String = "";
	// 1. unicode 文档 开头 16进制码为 FF FE ,对应 十进制 数 为 255,254   
	if (bytes[0]==255 && bytes[1]==254){   
	str =  bytes.readMultiByte(bytes.length,"unicode");   
	}    
	// 2.unicode big endian 开头 16进制 为 FE FF,对应十进制数 为 254,255   
	if (bytes[0]==254 && bytes[1]==255){   
		str =  bytes.readMultiByte(bytes.length,"UTF-16BE");
	}   
	// 3.utf-8 开头 16进制 为 EF BB ,对应 十进制 数 为 239,187   
	if (bytes[0]==239 && bytes[1]==187){   
		str =  bytes.readMultiByte(bytes.length,"utf-8");   
	}  
	if(bytes[0]==73 && bytes[1]==68){
		str =  bytes.readMultiByte(bytes.length,"ANSI");
	}
	return str;
}

  

分享到:
评论

相关推荐

    baidu语音识别 flex 版实现

    接着,在Flex应用中通过HTTP或HTTPS请求将音频数据发送到百度的识别接口,通常以POST方式提交音频文件或其Base64编码。 3. **处理返回结果**:百度的语音识别API会返回一个JSON格式的结果,其中包含了识别出的文本...

    flex编码规则

    Flex编码规则中明确规定了不同类型的文件应使用特定的扩展名,以便于管理和识别。MXML代码应使用`.mxml`扩展名,ActionScript代码应使用`.as`扩展名,而CSS代码则应使用`.css`扩展名。这种标准化的命名方式有助于...

    一个FLEX的小项目

    它使得Eclipse能够识别和管理Flex项目。 `flex_libs`可能是一个包含Flex库的文件夹,比如SWC库文件,这些库文件提供了Flex框架、组件和其他功能,供开发者在项目中引用。 `.settings`目录通常包含项目级别的...

    FLEX 图文编辑器(FLEX HTML编辑器)

    2. `.project`:这是Eclipse或Flex Builder项目配置文件,用于IDE识别和管理项目。 3. `build.properties` 和 `build.xml`:构建脚本,定义了编译和打包过程的规则。 4. `.settings`:包含项目的特定IDE设置,如编码...

    语法分析flex-2.5.2

    3. **扫描器生成**:Flex工具会根据规格文件生成C源代码,这个源代码是一个词法分析器,可以读取输入文本并识别出预定义的模式。 4. **错误处理**:理解如何在规格文件中处理未匹配的输入,以及如何报告错误。 5. ...

    Flex读取txt文件中的内容报错原因分析及解决

    - 文件格式不兼容:有时候是因为文件编码格式和Flex应用期望的格式不一致。 - 文件损坏:文件在存储或传输过程中可能已损坏,导致无法正确读取。 - Flex项目配置问题:Flex项目的编译器配置可能不支持某些特定的...

    让Editplus成为Flex的IDE

    将此文件导入EditPlus,可以增强对Flex开发的特定支持,提升编码效率。 3. `template.mxml` - 这是MXML模板文件,可以预设一些常用的MXML代码结构,比如组件的创建、事件处理等。在新建MXML文件时,可以直接应用这...

    flex 汉字转拼音

    这个"flex汉字转拼音"的主题涉及到Flex应用中处理中文字符并转换为拼音的能力,这对于开发涉及中文语音识别、搜索优化或者用户友好界面等功能的应用程序来说非常有用。 在Flex中,处理汉字转拼音通常需要利用特定的...

    Flex Mate框架swc包及Mate用法

    这个文件通常用于工具,如Flash Builder或Flex SDK的mxmlc编译器,以帮助它们识别和解析库中的内容。在使用Mate框架时,`catalog.xml`有助于确保正确地链接和解析框架中的类,使得开发过程更加顺利。 Mate框架的...

    Flex+System+基础技术原理之CMM管理演示

    4. **配置管理**:CMM强调版本控制和变更管理,这对于Flex项目尤其重要,因为项目中可能包含大量的资源文件、源代码和配置文件。通过有效的配置管理,可以跟踪代码变更,避免版本冲突,确保团队协同工作的顺畅。 5....

    flexbuilder3代码格式化插件

    开发者需要将此文件复制到FlexBuilder3的plugins目录下,以便于IDE识别并加载。启动FlexBuilder3后,用户可以通过插件菜单或者快捷键调用代码格式化功能。 2. **ActionscriptInfoCollector_0.1.0.jar**:这是一个...

    Flex代码检查PMD

    4. `flex-pmd-ruleset-1.0.RC4.jar`:这个文件包含了专门为Flex和AS3定制的PMD规则集。 5. `plexus-utils-1.0.2.jar`:Maven Plexus Utilities,可能用于提供项目管理和构建工具的支持。 6. `flex-pmd-core-1.0.RC...

    FLEX字体助手.rar

    《深入理解FLEX字体助手:实现嵌入字体编码的艺术》 在数字设计的世界里,字体是一种重要的视觉元素,它能够极大地影响用户对界面的第一印象。尤其是在网页和应用程序开发中,选择合适的字体并确保其在不同设备上的...

    Flex中的Hessian

    3. **配置服务**:在Flex的配置文件(如services-config.xml)中,你需要配置Hessian服务的URL和端点,以便客户端能够找到并调用。 4. **生成代理类**:Flex的工具(如Flex Builder)可以自动生成服务器端服务的...

    flex3.0快速入门资料

    - **命名空间**:为了能够识别Flex组件,MXML文件需要指定命名空间,例如 `&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&gt;`。 - **组件**:MXML 中可以通过 `&lt;mx:Button&gt;` 这样的标签来定义按钮等用户...

    JFlex指南(java flex词法分析器指南)

    - **扫描文本文件**:提供了如何正确读取和处理不同编码的文本文件的指导。 - **扫描二进制文件**:解释了如何处理二进制数据流。 #### 七、性能 - **JLex 与 JFlex 的比较**:对比了 JLex 和 JFlex 在性能上的...

    Flex试题 .txt

    根据给定的文件信息,以下是对“Flex试题.txt”中提到的关键知识点的详细解析: ### 1. Flex是什么? Flex是一种开源的软件框架,由Adobe Systems开发,用于构建跨平台的富互联网应用程序(RIA)。它使用MXML和...

    Flex Pmd 测试工具提高代码品质

    在Flex项目中,PMD可以通过分析源代码文件,提供关于潜在错误和不良编程习惯的报告。这些报告可以帮助开发者遵循最佳实践,减少bug的数量,并提高代码的执行效率。PMD的使用并不复杂,通常需要将PMD的jar包集成到...

Global site tag (gtag.js) - Google Analytics