0\ iconv 的使用http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html#iconv-Examples
1\ TestUtf8 中的 测试把GBK中的数据转换为unicode,然后索引
void _Index(CuTest *tc, IndexWriter* ndx,char* file){
char path[CL_MAX_PATH];
TCHAR tlang[20];
strcpy(path,clucene_data_location);
strcat(path,"/utf8text");
CuAssert(tc,_T("Utf8 directory does not exist"),Misc::dir_Exists(path));
strcat(path,"/");
strcat(path,file);
/*strcat(path,"_utf8.txt");*/
strcat(path,"_gbk.txt");
CuAssert(tc,_T("Language file does not exist"),Misc::dir_Exists(path));
STRCPY_AtoT(tlang,file,CL_MAX_PATH);
Document doc;
doc.add(*Field::Keyword(_T("language"),tlang));
jstreams::FileReader* fr = new jstreams::FileReader(path, "GBK");
// StandardAnalyzer analyzer;
// TokenStream* stream = analyzer.tokenStream(NULL, _CLNEW CL_NS(util)::Reader(fr,true));
doc.add(*Field::Text(_T("contents"), _CLNEW CL_NS(util)::Reader(fr,true) ));
ndx->addDocument(&doc);
}
2\ clucene 中util 库代码中的FileInputStream,一个从文件中读出数据填充到缓存中方法
int32_t FileInputStream::fillBuffer(char* start, int32_t space) {
if (file == 0) return -1;
// read into the buffer
int32_t nwritten = fread(start, 1, space, file);
// check the file stream status
if (ferror(file)) {
error = "Could not read from file '" + filepath + "'.";
fclose(file);
file = 0;
status = Error;
return -1;
}
if (feof(file)) {
fclose(file);
file = 0;
}
return nwritten;
}
3\
有关的
template <class T> template <class char>
void InputStreamBuffer<T>::setSize(int32_t size) {
// store pointer information
int32_t offset = (int32_t)(readPos - start);
// allocate memory in the buffer
if ( start == 0 )
start = (T*)malloc(size*sizeof(T));
else
start = (T*)realloc(start, size*sizeof(T));
this->size = size;
// restore pointer information
readPos = start + offset;
}
4\GBK转UCS-2码,然后索引 iconv_t converter = iconv_open("UCS-2-INTERNAL", "GBK");
//iconv_t converter = iconv_open("UCS-2-INTERNAL", "UTF-8");
// iconv_t converter = iconv_open("UCS-2-INTERNAL", "ASCII");
const char *inbuf ="我喜欢你欧阳";
size_t inbytesleft = strlen(inbuf);
wchar_t* start=(wchar_t*)malloc(inbytesleft*sizeof(wchar_t));
memset(start,0,inbytesleft*sizeof(wchar_t));
size_t outbytesleft = sizeof(wchar_t)*inbytesleft;
char *outbuf = (char*)start;
size_t r = iconv(converter, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
iconv_close(converter);
doc.add(*Field::Text(_T("contents"),start));
4\从gb2312转 utf8 ,再从utf8转 ucs-2
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,const char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
iconv_t cd;
int rc;
const char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}
iconv_t converter = iconv_open("UCS-2-INTERNAL", "UTF-8");
//gb2312码转为unicode码
char *in_gb2312="我喜欢你欧阳";
size_t tmpleng = strlen(in_gb2312);
// char out[500];
char* out=(char*)malloc(3*tmpleng*sizeof(char));
int rec = g2u(in_gb2312,strlen(in_gb2312),out,3*tmpleng);
const char * inbuf=out;
size_t inbytesleft = strlen(inbuf);
wchar_t* start=(wchar_t*)malloc(inbytesleft*sizeof(wchar_t));
memset(start,0,inbytesleft*sizeof(wchar_t));
size_t outbytesleft = sizeof(wchar_t)*inbytesleft;
char *outbuf = (char*)start;
size_t r = iconv(converter, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
iconv_close(converter);
doc.add(*Field::Text(_T("contents"),start));
分享到:
相关推荐
CLucene的源代码提供了深入理解信息检索和搜索引擎工作原理的机会。开发者可以查看和修改源代码,了解索引构建、查询解析、搜索执行等核心流程,这对于开发自定义的搜索引擎或扩展现有功能非常有用。通过学习CLucene...
通过 CLucene 的源代码学习,你可以深入理解全文检索的工作原理,掌握索引构建和查询优化的技术。对于想要提升 C++ 应用程序搜索功能的开发者来说,研究 CLucene 源代码是十分有益的。同时,你还可以了解到如何在 ...
此外,"吐血推荐"表明这个源码具有很高的学习价值,可能是由于其代码质量高、注释清晰或实现了某些创新特性。因此,对于想要在C++环境中开发全文搜索功能的开发者来说,这份源码是一份不可多得的学习资源。 在...
《C++搜索引擎Clucene源码解析》 在信息技术飞速发展的今天,搜索引擎已经成为了人们获取信息的重要工具。本文将深入探讨C++实现的全文搜索引擎——Clucene,通过对源码的剖析,来理解其核心概念、设计思想以及实现...
1. **安装与配置**:下载CLucene源码,根据项目需求选择合适的编译选项,进行编译和链接。 2. **创建索引**:使用CLucene API读取文档内容,进行文本分析,并建立索引。 3. **查询索引**:编写查询代码,解析用户...
大名鼎鼎的clucene,是lucene的c++ 版; CLucene README ============== ------------------------------------------------------ CLucene is a C++ port of Lucene. It is a high-performance, full-featured ...
在Windows环境下,使用CMake工具是将CLucene源码转化为Visual Studio 2013兼容工程的关键步骤。CMake是一个跨平台的自动化构建系统,它可以生成各种IDE的项目文件,包括VS2013的.sln解决方案文件。首先,你需要下载...
《C语言实现的Lucene——clucene源代码解析》 Lucene,作为一款著名的全文搜索引擎库,由Java编写,广泛应用于各种信息检索系统。然而,对于C语言开发者来说,使用Java版Lucene可能会面临一些挑战。为了满足这部分...
这些都需要对Clucene的源代码进行深入理解和修改。 总的来说,"clucene中文处理"是一个综合性的任务,它涵盖了中文分词、索引构建、查询解析、编码处理等多个技术领域。开发者需要对C++编程、自然语言处理、信息...
CLucene是基于C++语言实现的一个全文搜索引擎库,它是对Java版Lucene的移植,旨在为C++开发者提供与Lucene类似的搜索功能。Lucene是一个广泛使用的开源信息检索库,由Apache软件基金会维护,它提供了丰富的文本分析...
三、Clucene源码导入 将Clucene的源码文件夹添加到vc6工程中,确保所有头文件和源文件能够被正确引用。注意,Clucene可能依赖一些外部库如zlib和bzip2,需要确保这些库也已正确配置。 四、构建DEMO项目 在vc6中...
这是我学CLUCENE时期整理出来的几个不错的资料,我觉得里面总有一款会适合你,而且你所需要知道的技术里面基本上都是涵盖的,所以可以当作教材或者参考手册使用。(里面有CLUCENE,可以用的)
最后,压缩包中的文件`clucene-cored.dll`和`clucene-sharedd.dll`是Clucene库的核心和共享组件,它们包含了Clucene的实现代码。而`MyCluceneDll.dll`很可能是用户封装后的库文件,直接调用这个库可以避免与原始...
这个压缩包包含了Clucene的核心源代码,对于想要理解搜索引擎工作原理、学习C++编程以及对信息检索技术感兴趣的开发者来说,是一份宝贵的资源。 首先,Clucene是Lucene的C++实现,Lucene是一个广泛使用的全文搜索...
CLucene类结构文档 内嵌源代码及各类关系图
因此,提供了一个“干净”的版本,即不包含任何个人机器特定设置的源代码,用户需要自行使用CMake来生成适用于他们本地环境的Visual Studio 2005项目。这里提到的“说明文档”很可能是指导用户如何使用CMake来配置和...
根据错误信息,定位源代码中的问题,进行相应修正。 6. **测试与优化**:成功构建后,进行单元测试和功能测试,确保Clucene-core-2.3.3.4的核心功能正常工作。同时,可以考虑优化代码,提高性能,比如使用预编译...
- **源码开放**:作为一个开源项目,CLucene允许开发者查看和修改源代码,满足定制化需求。 - **易于集成**:CLucene提供API供其他应用程序调用,方便集成到各种软件项目中。 2. **版本与编译环境** - 版本号:...
总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document可以看作是 数据库的一行记录,Field可以看作是数据库的字段。用lucene实 现搜索引擎就像用JDBC实现连接数据库一样简单。