这是一篇转帖共同学习共同讨论
两天前看到你这个问题,那个时候我也一样遇到了,本打算等有大侠来解决的,结果等到花都谢了,废话少说,说说我这几天调研的结果:
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;
}
分享到:
相关推荐
接着,在Flex应用中通过HTTP或HTTPS请求将音频数据发送到百度的识别接口,通常以POST方式提交音频文件或其Base64编码。 3. **处理返回结果**:百度的语音识别API会返回一个JSON格式的结果,其中包含了识别出的文本...
Flex编码规则中明确规定了不同类型的文件应使用特定的扩展名,以便于管理和识别。MXML代码应使用`.mxml`扩展名,ActionScript代码应使用`.as`扩展名,而CSS代码则应使用`.css`扩展名。这种标准化的命名方式有助于...
它使得Eclipse能够识别和管理Flex项目。 `flex_libs`可能是一个包含Flex库的文件夹,比如SWC库文件,这些库文件提供了Flex框架、组件和其他功能,供开发者在项目中引用。 `.settings`目录通常包含项目级别的...
2. `.project`:这是Eclipse或Flex Builder项目配置文件,用于IDE识别和管理项目。 3. `build.properties` 和 `build.xml`:构建脚本,定义了编译和打包过程的规则。 4. `.settings`:包含项目的特定IDE设置,如编码...
3. **扫描器生成**:Flex工具会根据规格文件生成C源代码,这个源代码是一个词法分析器,可以读取输入文本并识别出预定义的模式。 4. **错误处理**:理解如何在规格文件中处理未匹配的输入,以及如何报告错误。 5. ...
- 文件格式不兼容:有时候是因为文件编码格式和Flex应用期望的格式不一致。 - 文件损坏:文件在存储或传输过程中可能已损坏,导致无法正确读取。 - Flex项目配置问题:Flex项目的编译器配置可能不支持某些特定的...
将此文件导入EditPlus,可以增强对Flex开发的特定支持,提升编码效率。 3. `template.mxml` - 这是MXML模板文件,可以预设一些常用的MXML代码结构,比如组件的创建、事件处理等。在新建MXML文件时,可以直接应用这...
这个"flex汉字转拼音"的主题涉及到Flex应用中处理中文字符并转换为拼音的能力,这对于开发涉及中文语音识别、搜索优化或者用户友好界面等功能的应用程序来说非常有用。 在Flex中,处理汉字转拼音通常需要利用特定的...
这个文件通常用于工具,如Flash Builder或Flex SDK的mxmlc编译器,以帮助它们识别和解析库中的内容。在使用Mate框架时,`catalog.xml`有助于确保正确地链接和解析框架中的类,使得开发过程更加顺利。 Mate框架的...
4. **配置管理**:CMM强调版本控制和变更管理,这对于Flex项目尤其重要,因为项目中可能包含大量的资源文件、源代码和配置文件。通过有效的配置管理,可以跟踪代码变更,避免版本冲突,确保团队协同工作的顺畅。 5....
开发者需要将此文件复制到FlexBuilder3的plugins目录下,以便于IDE识别并加载。启动FlexBuilder3后,用户可以通过插件菜单或者快捷键调用代码格式化功能。 2. **ActionscriptInfoCollector_0.1.0.jar**:这是一个...
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字体助手:实现嵌入字体编码的艺术》 在数字设计的世界里,字体是一种重要的视觉元素,它能够极大地影响用户对界面的第一印象。尤其是在网页和应用程序开发中,选择合适的字体并确保其在不同设备上的...
3. **配置服务**:在Flex的配置文件(如services-config.xml)中,你需要配置Hessian服务的URL和端点,以便客户端能够找到并调用。 4. **生成代理类**:Flex的工具(如Flex Builder)可以自动生成服务器端服务的...
- **命名空间**:为了能够识别Flex组件,MXML文件需要指定命名空间,例如 `<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">`。 - **组件**:MXML 中可以通过 `<mx:Button>` 这样的标签来定义按钮等用户...
- **扫描文本文件**:提供了如何正确读取和处理不同编码的文本文件的指导。 - **扫描二进制文件**:解释了如何处理二进制数据流。 #### 七、性能 - **JLex 与 JFlex 的比较**:对比了 JLex 和 JFlex 在性能上的...
根据给定的文件信息,以下是对“Flex试题.txt”中提到的关键知识点的详细解析: ### 1. Flex是什么? Flex是一种开源的软件框架,由Adobe Systems开发,用于构建跨平台的富互联网应用程序(RIA)。它使用MXML和...
在Flex项目中,PMD可以通过分析源代码文件,提供关于潜在错误和不良编程习惯的报告。这些报告可以帮助开发者遵循最佳实践,减少bug的数量,并提高代码的执行效率。PMD的使用并不复杂,通常需要将PMD的jar包集成到...