让你的文档能在诺基亚“当前备忘 (ActiveNotes)”中打开编辑

很喜欢诺基亚手机里的“当前备忘”这个自带的软件,一直希望能够用它打开编辑自己的文档。早些时候,曾尝试做过一些努力,发现自己生成的HTML格式文档在里面一打开就提示格式不支持,然后文档就被删除了。
一直以为是自己没弄清里边的an_nuid data和an_duid data标签的含义,故而很快自己就放弃尝试,转向自定义网页格式阅读这方面。
直到今天早上,自己下定决心要探求一番。先是用各种搜索想知道an_nuid data这个字段的含义是什么,无论是Baidu,还是Bing,还是Google,都没有找到有价值的东西。反倒是Google,居然把我以前写的博客给倒腾出来了。
没办法只好自己开始反复的试验。
首先,自己假定,an_nuid data是和文本内容相关的东西,那么对于同样的文本内容,这个字段的东西是应该相同的。在手机里生成的文档对比发现,不同。那么假设不成立了。同时,也发现,an_duid data这个字段,无论什么文档,都是不变的,我的手机是Nokia5320di,这个字段是<an_duid data=\"9f8e2bee6b38ca3f4a18a381ec01c890\"/>。我推测,应该不同的型号的诺基亚手机这个是不同的。不过,手头里没有其他型号,也无法验证。作罢。
既然这样,我就可以固定一个字段了,另一个字段an_nuid data,既然与文档无关,就随便写个试试看。
先是直接在文档里修改,将原先的内容直接替换成自己的内容,导到手机里的Activenotes文件夹里,打开,发现可以。
继续试验,用以前自己写的Txt2Html程序生成的HTML文件在记事本打开,然后与手机生成的HTML文件逐一对比,格式尽量做到和它一致。
导到手机里试验后,发现Activenotes对<br>标签不识别,于是按照它分段的方法,用<p></p>标签修改程序。
经过这么一番修改,导到手机里,发现果然可以打开编辑了。
到这一步还没完,于是继续试验,逐个将开始改的再改回来,看那些因素究竟是不是有决定性影响。发现,其实去掉an_nuid data和an_duid data字段,Activenotes依然可以打开编辑,而body{}里的格式控制符也是无关紧要的。但是,当编辑保存之后,an_nuid data和an_duid data字段会自动添加进去,body{}里的格式控制符,也将修改为固定的background-color: #FFFF88; font-family: arial; 。因此原先的作为Txt2Html程序控制格式的参数变得多余了。

下面贴出今天上午半天的“探索”成果,Txt2Html的核心代码,这是在原先博客中文本转网页dll源码中修改的:

// txt2html.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "txt2html.h"


using namespace std;

string& replaceAll(string& context,const string& from,const string& to);

unsigned long infoLog;

BOOL APIENTRY DllMain( HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{
    return TRUE;
}

unsigned long GetInfoLog()
{	
	return infoLog;	
}

int Txt2Html(char *file, char *para)
{
	// file Title List
	// 定义文件变量
	
	string inFilePath,outFilePath,fileExtName,fileTitle;
	string filePathName;
	
	// 解析文件参数
	inFilePath=string(file);
	size_t lastPoint=inFilePath.rfind('.');
	size_t lastDivd=inFilePath.rfind('\\');
	
	fileExtName=inFilePath.substr(lastPoint+1,3);
	fileTitle=inFilePath.substr(lastDivd+1,lastPoint-lastDivd-1);
	filePathName=inFilePath.substr(0,lastDivd+1);
	
	if(fileExtName.compare("txt")&&fileExtName.compare("TXT"))
	{
		infoLog=ERROR_INVALID_PARAMETER;
		return 1;
	}	
	
	string strLine;
	
	inFilePath=filePathName+fileTitle+string(".txt");
	outFilePath=filePathName+fileTitle; // 生成临时文件
	
	ifstream inFile(inFilePath.c_str());
	if(!inFile)
	{
		infoLog=GetLastError();
		return 1;
	}
	
	ofstream outFile(outFilePath.c_str(),ios::binary);
	if(!outFile)
	{
		infoLog=GetLastError();
		return 1;
	} 
	// generate file head 
	outFile<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		<<"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
		<<"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
		<<"<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n"
		<<"<title>"<<fileTitle<<"</title>\n"
		<<"<style type=\"text/css\">\nbody {"
		<<"background-color: #FFFF88; font-family: arial;"
		<<" }\nimg {border: none;}\n</style>\n"
		<<"</head>\n<body>\n";
	
	for(;;)
	{
		if(inFile.eof())break;
		
		getline(inFile,strLine,'\n');
		
		if(!strLine.empty())
		{			
			replaceAll(strLine,"&","&amp;"); // It should be the first
			
			replaceAll(strLine,"<","&lt;");
			replaceAll(strLine,">","&gt;");
			replaceAll(strLine,"  ","&nbsp;&nbsp;");
			replaceAll(strLine,"\"","&quot;");
			replaceAll(strLine,"\t","&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
		}
		
		outFile<<"<p><font>"<<strLine<<"</font></p>";				
	}
	
	outFile<<"</body></html>\n";
	
	inFile.close();
	outFile.close();	
	
	// 处理UTF-8转码

	inFilePath=filePathName+fileTitle;
	outFilePath=filePathName+fileTitle+string(".html");
	
	inFile.open(inFilePath.c_str(),ios::binary);
	if(!inFile.is_open())
	{
		infoLog=GetLastError();
		return 1;
	}
	
	outFile.open(outFilePath.c_str(),ios::binary);
	if(!outFile.is_open())
	{
		infoLog=GetLastError();
		return 1;
	} 
		
	
	ostringstream ansiTextStringStream;
	
	ansiTextStringStream<<inFile.rdbuf();
	
	string ansiTextString=string(ansiTextStringStream.str());
	
	int uniTextLength=MultiByteToWideChar(CP_ACP,NULL,ansiTextString.c_str(),ansiTextString.length(),NULL,0); // 获得转换缓冲区大小
	
	if(!uniTextLength) 
	{
		infoLog=GetLastError();
		return 1;
	}
	
	LPWSTR uniTextBuf = new WCHAR[uniTextLength];
	
	if(!MultiByteToWideChar(CP_ACP, NULL, ansiTextString.c_str(),ansiTextString.length(), uniTextBuf, uniTextLength))
	{
		infoLog=GetLastError();
		return 1;
	}
	
	int utf8TextLength=WideCharToMultiByte(CP_UTF8, NULL, uniTextBuf, uniTextLength, NULL,0,NULL,NULL);
	
	if(!utf8TextLength) 
	{
		infoLog=GetLastError();
		return 1;
	}
	
	LPSTR utf8TextBuf=new CHAR[utf8TextLength];
	
	if(!WideCharToMultiByte(CP_UTF8, NULL, uniTextBuf, uniTextLength, utf8TextBuf, utf8TextLength,NULL,NULL))
	{
		infoLog=GetLastError();
		return 1;
	}
	
	outFile.write(utf8TextBuf,utf8TextLength);
	
	if(uniTextBuf)
	{
		delete []uniTextBuf;
	}
	if(utf8TextBuf)
	{
		delete []utf8TextBuf;
	}
	
	
	inFile.close();
	outFile.close();
	
	DeleteFile(inFilePath.c_str());
		
	
	infoLog=1;
	return 0;
	
}

string& replaceAll(string& context,const string& from,const string& to)
{
	size_t lookHere = 0;
	size_t foundHere;
	while((foundHere=context.find(from,lookHere))!=string::npos)
	{
		context.replace(foundHere,from.size(),to);
		lookHere=foundHere+to.size();
		
	}
	return context;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值