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文本文件的编码检测的更多相关文章

  1. Atitit.检测文本文件的编码 自动获取文件的中文编码

    Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...

  2. atitit.Atitit.检测文本文件的编码 java  与php版  。Net

    atitit.Atitit.检测文本文件的编码 java  与php版  .Net 1 检测编码原理 Utf8>>gbk 在此转会gbk>>utf 2 工具检测编码 不能使用l ...

  3. C#获取文本文件的编码,自动区分GB2312和UTF8

    C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...

  4. iOS中使用 Reachability 检测网络

    iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都 ...

  5. [No000040]取得一个文本文件的编码方式

    using System; using System.IO; using System.Text; /// <summary> /// 用于取得一个文本文件的编码方式(Encoding). ...

  6. UTF编码检测

    最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...

  7. python文件(概念、基本操作、常用操作、文本文件的编码方式)

    文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...

  8. 文件编码检测.ZC一些资料(包含java的)

    1.IMultiLanguage3 或者 IMultiLanguage2 1.1.怎么判断XML 的编码格式(UTF-8或GB2312等)-CSDN论坛.html(https://bbs.csdn.n ...

  9. iOS 版本更新(强制更新)检测问题

    iOS 版本更新(强制更新)检测问题 通常iOS系统中是默认设置再wifi状态,且网络状况良好下自己更新应用的. 但是如果用户设置了不自动更新,但是我们的APP出现重要的版本,一定需要用户更新的情况下 ...

随机推荐

  1. C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

    基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...

  2. QT5.9 新特性与版本回顾

    原文链接: http://blog.qt.io/blog/2017/05/31/qt-5-9-released 翻译内容如下,采用的是第三方某在线翻译软件,所以有些地方不是太精确,纵然大吉做了一定的调 ...

  3. CSS background 属性详解

    CSS background Property 语法: background: bg-color bg-image position/bg-size bg-repeat bg-origin bg-cl ...

  4. python迭代器 生成器 三元运算 列表解析

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  5. Redis(二):c#连接Redis

    1.nuget StackExchange.Redis 2.建立RedisHelper类: public class RedisHelper { /// <summary> /// 连接字 ...

  6. webpack学习笔记丁点积累

    webpack是什么? https://webpack.js.org/concepts/ https://code.tutsplus.com/tutorials/introduction-to-web ...

  7. Excel操作之级联菜单

    设置级联菜单主要用的是excel的数据验证功能.下面以简单的设置城市选择框为例: 1.准备好数据 2.给所有省份起个名称(例如:省份),然后同样方法给每个省份所对应的城市以其省份命名,(例如:南京.苏 ...

  8. [EffectiveC++]item17:以独立语句将newed对象置入智能指针

    Store newed objects in smart pointers in standalone statements

  9. java重载

    public class overLaod { public static void main(String[] args) { // TODO Auto-generated method stub ...

  10. python连接数据库并插入数据

    1.Python创建数据库 import MySQLdb try: conn = MySQLdb.connect( host="127.0.0.1", port=3306, use ...