IOS 实现TXT文本自动识别编码的方法
from :http://kyoworkios.blog.51cto.com/878347/1344013
?
TXT識(shí)別編碼是個(gè)復(fù)雜的問(wèn)題。幸好有c/c++的一個(gè)庫(kù)能識(shí)別。
庫(kù)的叫uchardet,可以自己去github下載。但是沒(méi)有具體的使用手冊(cè)什么的。小研究了下 。
把uchardet文件夾下的.h和.cpp和.tab文件全部copy到自己的應(yīng)用里面。然后在要自動(dòng)識(shí)別編碼的地方
#include?"uchardet.h"
?
如下代碼實(shí)現(xiàn)。
//
// ?EBOOKReadViewController.m
// ?EBOOk
//
// ?Created by?趙鋒?on 13-12-18.
// ?Copyright (c) 2013年趙鋒. All rights reserved.
//
?
#import?"EBOOKReadViewController.h"
#include?"uchardet.h"
#define NUMBER_OF_SAMPLES ? (2048)
@interfaceEBOOKReadViewController?()
{
constchar?*encode;
}
@end
?
@implementation?EBOOKReadViewController
?
- (id)initWithNibName:(NSString?*)nibNameOrNil bundle:(NSBundle?*)nibBundleOrNil
{
self?= [superinitWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
if?(self) {
// Custom initialization
? ?}
returnself;
}
?
- (void)viewDidLoad
{
? ?[superviewDidLoad];
?
NSString?*path=[[NSBundlemainBundle]?pathForResource:@"五界至尊"?ofType:@"txt"];
?
int?result=[selfhaveTextBianMa:[path?UTF8String]];
CFStringEncoding?cfEncode =?0;
if?(result==0) {
?
NSString?*encodeStr=[[NSStringalloc]?initWithCString:encodeencoding:NSUTF8StringEncoding];
?
?
?
?
?
?
if?([encodeStr?isEqualToString:@"gb18030"]) {
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingGB_18030_2000;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"Big5"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingBig5;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"UTF-8"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingUTF8;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"Shift_JIS"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingShiftJIS;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"windows-1252"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingWindowsLatin1;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"x-euc-tw"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingEUC_TW;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"EUC-KR"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingEUC_KR;
?
? ? ? ?}elseif([encodeStr?isEqualToString:@"EUC-JP"]){
?
? ? ? ? ? ?cfEncode=?kCFStringEncodingEUC_JP;
?
? ? ? ?}
?
? ?}
?
NSError?*err;
NSString?*str=[NSStringstringWithContentsOfFile:pathencoding:CFStringConvertEncodingToNSStringEncoding(cfEncode)?error:&err];
?
NSString?*st=[str?substringToIndex:1000];
?
self.txtView.text=st;
?
}
-(int)haveTextBianMa:(constchar*)strTxtPath{
FILE* file;
char?buf[NUMBER_OF_SAMPLES];
size_t?len;
uchardet_t?ud;
?
/*?打開(kāi)被檢測(cè)文本文件,并讀取一定數(shù)量的樣本字符?*/
? ?file =?fopen(strTxtPath,?"rt");
if?(file==NULL) {
printf("文件打開(kāi)失敗!\n");
return1;
? ?}
? ?len =?fread(buf,?sizeof(char),?NUMBER_OF_SAMPLES, file);
fclose(file);
?
? ?ud =?uchardet_new();
if(uchardet_handle_data(ud, buf, len) !=?0)
? ?{
printf("分析編碼失敗!\n");
return?-1;
? ?}
uchardet_data_end(ud);
printf("文本的編碼方式是%s。\n",?uchardet_get_charset(ud)); ?
encode=uchardet_get_charset(ud);
?
uchardet_delete(ud);
?
return0;
}
- (void)didReceiveMemoryWarning
{
? ?[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
?
@end
?
轉(zhuǎn)載于:https://www.cnblogs.com/lucky-star-star/p/5749401.html
總結(jié)
以上是生活随笔為你收集整理的IOS 实现TXT文本自动识别编码的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 问道手游金系加点
- 下一篇: spring之bean的作用域scope