iOS文本文件的编码检测
windows上很多文本未必是用UTF8,所以在iOS上读取的时候,如何得到文件的编码是个问题。网上有很多读取中文的例子,但是那些不够通用。比如说要读取日文,韩文,阿拉伯文等等的时候,就不行了(虽然一般的app不一定会有这样的需求)。
NSString自己带一个函数:
+ (instancetype)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;
如果String创建成功,enc会返回使用的NSStringEncoding。但是这个方法对于NSStringEncoding以外的编码都不一定能成功创建NSString,同时也不会返回error。
Apple 的官方文档提供了读取未知encoding数据的一些参考步骤:

简单的总结,就是不停的用encoding去测试。这其中有个小技巧,根据程序面向的用户,把用到的encoding按可能性排列下,这样最有希望获得需要的结果。
虽然Apple的文档给出了这样的解决方案,但是发现很多阅读App读取各种编码方式的文件,毫无压力。因此,这里一定有其他方法。问了某道友,说chardet可以,可是一搜,发现是python实现!虽然没结果,不过我发现这是个非常普遍的问题。于是,再次搜索查找,找到了BOM,找到了mozzilla charset detector,找到了uchardet。uchardet的源码在github上。他的基本原理好像也是用编码去检测,谁先返回,就确认是哪个编码(这里不确定,未深究)。
项目是C/C++实现,直接添加进iOS工程,记得修改使用到的文件后缀为mm,运行后测试,发现能很好的识别我遇到的几种编码文件。项目中有使用的例子,就不贴图说明使用过程了。
需要说明的是,对于需要使用kCFStringEncodingGB_18030_2000来创建的中文文本,识别出来的居然是IBM855。 google了下,也不知道IBM855是啥意思。为了赶时间,暂时对需要的几种编码做了映射。
如果有哪位知道的,麻烦指点指点,这里先谢过了。
本文已同步到: http://icocoa.tk/2013/11/16/ios文本文件的编码检测/,欢迎访问
iOS文本文件的编码检测的更多相关文章
- Atitit.检测文本文件的编码 自动获取文件的中文编码
Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...
- atitit.Atitit.检测文本文件的编码 java 与php版 。Net
atitit.Atitit.检测文本文件的编码 java 与php版 .Net 1 检测编码原理 Utf8>>gbk 在此转会gbk>>utf 2 工具检测编码 不能使用l ...
- C#获取文本文件的编码,自动区分GB2312和UTF8
C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...
- iOS中使用 Reachability 检测网络
iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Reachability都 ...
- [No000040]取得一个文本文件的编码方式
using System; using System.IO; using System.Text; /// <summary> /// 用于取得一个文本文件的编码方式(Encoding). ...
- UTF编码检测
最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...
- python文件(概念、基本操作、常用操作、文本文件的编码方式)
文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...
- 文件编码检测.ZC一些资料(包含java的)
1.IMultiLanguage3 或者 IMultiLanguage2 1.1.怎么判断XML 的编码格式(UTF-8或GB2312等)-CSDN论坛.html(https://bbs.csdn.n ...
- iOS 版本更新(强制更新)检测问题
iOS 版本更新(强制更新)检测问题 通常iOS系统中是默认设置再wifi状态,且网络状况良好下自己更新应用的. 但是如果用户设置了不自动更新,但是我们的APP出现重要的版本,一定需要用户更新的情况下 ...
随机推荐
- 颤振错误:当前Flutter SDK版本为2.1.0-dev.0.0.flutter-be6309690f?
我刚刚升级了我的扑动,升级后我无法在Android Studio上运行任何扑动项目.我收到此错误消息. The current Dart SDK version -dev.0.0.flutter-be ...
- python 静态 封装 继承 mro 接口 super
1.静态属性 静态方法 类方法 #!/usr/bin/python env # encoding: utf-8 # 静态属性 静态方法 class Room: tag = 168 def __ini ...
- QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化
https://www.techieliang.com/2017/12/729/ 原文地址 using_checkbox_item.h /** * @file using_checkbox_item. ...
- 在 O(1) 时间删除链表结点(C 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 给定单向链表的头指针和一个结点指针,定义一个函数在 O(1) ...
- Java容器之HashMap源码分析
在java的容器框架中,hashMap是最常用的容器之一,下面我们就来深入了解下它的数据结构和实现原理 先看下HashMap的继承结构图 下面针对各个实现类的特点进行下说明:1)HashMap: 它是 ...
- 平均负载(Load average)
load average 的含义平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. top命令中load average显示的是最近1分钟.5分钟和1 ...
- 【Oracle】查看被锁的表和解锁
--以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...
- 火狐浏览器对svg支持的一点不足
项目中要用svg实现一个如下图所示的风机扇叶转动效果 当用chrome浏览器打开,动画显示正常.用火狐浏览器打开扇叶静止不动,代码如下: <svg xmlns:cge="http:// ...
- CSS边框长度控制
以前需要边框长度比容器小一些时,我用div嵌套.后来发现伪类在实现这个效果时很方便,只需要一个div就够了,另外调整padding和margin都不会很麻烦. <div class=" ...
- 沉淀再出发:spring boot的理解
沉淀再出发:spring boot的理解 一.前言 关于spring boot,我们肯定听过了很多遍了,其实最本质的东西就是COC(convention over configuration),将各种 ...