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. JQuery 判断指定ID是否存在

  2. [算法练习]Reverse Integer

    题目说明: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return –321   ...

  3. oracle 帐号scott被锁定 如何解锁

    由于多次输入:账号 密码不对 oracle 帐号scott被锁定 如何解锁: 具体操作步骤如下:C:> sqlplus请输入用户名:sys输入口令:sys as sysdba //注意:在口令这 ...

  4. vue从安装到初始化项目

  5. [翻译] SvpplyTable

    SvpplyTable https://github.com/liuminqian/SvpplyTable SvpplyTable is a demo to realize expandable an ...

  6. Zip压缩/解压缩(文件夹)

    #PS2.0压缩为.zip文件: $zip = "D:\audit_log\test.zip"New-Item $zip -ItemType file$shellApplicati ...

  7. 第一个c程序和vs2017 在打开MFC rc文件时找不到rcdll.dl

    第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...

  8. August 24th 2017 Week 34th Thursday

    If you have choices, choose the best. If you have no choice, do the best. 如果有选择,那就选择最好的:如果没有选择,那就努力做 ...

  9. [COGS 0107][NOIP 2003] 传染病控制

    107. [NOIP2003] 传染病控制 ★★★   输入文件:epidemic.in   输出文件:epidemic.out   简单对比时间限制:1 s   内存限制:128 MB [问题背景] ...

  10. Android App 注射&&Drozer Use

    x01 准备工作 测试环境: 1) 手机root权限 2) Adb.exe 3) 手机usb连接开启debug模式(在设置>关于手机>连续点击多次版本号,即可开启开发者模式) 4) Win ...