在PDFLib中,打开一个PDF文档,会调用PDF_begin_document,文件名称是以Unicode编码的,由于工程是多字节编码,打算转成UTF8
定义:int PDF_begin_document(PDF *p, const char *filename, int len, const char *optlist)
C++ Java int begin_document(String filename, String optlist)
参数说明filename (名称字符串,但只在 Windows 上支持 Unicode 文件名)将生成 PDF 输出文件的绝对或相对文件名。如果 filename 为空,则将在内存中生成 PDF 文档,而不创建文件,因而只能从客户端通过 PDF_get_buffer( ) 函数来获取生成的 PDF 数据。特殊文件名 »–« 可用来在 stdout 通道上生成 PDF。在 Windows 上,可以使用 UNC 路径或映射网络驱动器。
len (仅用于 C 语言绑定)UTF-16 字符串的 filename 长度(以字节为单位)。如果 len=0,则必须提供以 null 终结的字符串。optlist 选项列表,根据表 2.3 指定文档选项。PDF_end_document( ) 中指定的选项优先于PDF_begin_document( ) 中指定的相同选项。可以使用下列选项:
附件、autoxmp、compatibility、destination、errorpolicy、flush、groups、hypertext-encoding、
inmemory、labels、lang、linearize、master- password、metadata、moddate、openmode、
optimize、pagelayout、pdfa、pdfx、permissions、recordsize、search、tagged、tempdirname、
temp-filenames、uri、user-password、viewer-preferences。
多字节转UTF8 网上很多 例如:
void ConvertGBKToUtf8(std::string& amp, std::string strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK.c_str(), -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK.c_str(), -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
//strGBK = szUtf8;
amp=szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
研究发现,UTF8前面需要加BOM(Byte Order Mark,就是字节序标记)
UTF- 8编码的文件中,BOM占三个字节。字节标记序为 EF BB BF
上面转换来的string 还要在前面加上3个字节,为了简单,两个字符串拼接起来,这样就可以处理中文的
char Bom[4]={0xEF,0xBB,0xBF,0};
filenameBom=Bom;
filenameBom=filenameBom+filename;
PDF_begin_document(p,filenameBom.c_str(),0, "");