很喜欢诺基亚手机里的“当前备忘”这个自带的软件,一直希望能够用它打开编辑自己的文档。早些时候,曾尝试做过一些努力,发现自己生成的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程序控制格式的参数变得多余了。
一直以为是自己没弄清里边的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,"&","&"); // It should be the first
replaceAll(strLine,"<","<");
replaceAll(strLine,">",">");
replaceAll(strLine," "," ");
replaceAll(strLine,"\"",""");
replaceAll(strLine,"\t"," ");
}
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;
}