rtf格式的一些说明

RTF是Rich TextFormat的缩写,意即多文本格式。这是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows“附件”中的“写字板”就能打开并进行编辑。RTF是一种非常流行的文件结构,很多文字编辑器都支持它。一般的格式设置,比如字体和段落设置,页面设置等等信息都可以存在RTF格式中,它能在一定程度上实现word与wps文件之间的互访。 
RTF语法
一个RTF文件由未格式化文本、控制字、控制符号和组组成。为了更容易的转换,一个标准的RTF文件应该仅包含7位ASCII码字符。RTF文件没有限制文件的行的最大长度。(再议:maximun line length是指行的字符数还是指文档的行数?)
An RTF file consists of unformatted text, control words, control symbols, and groups. For ease of transport, a standard RTF file can consist of only 7-bit ASCII characters. (Converters that communicate with Microsoft Word for Windows or Microsoft Word for the Macintosh should expect 8-bit characters.) There is no set maximum line length for an RTF file.
控制字是一种特殊的RTF用来标记打印机控制符的格式化命令,也是程序用来管理文档样式的格式化信息。(再议:措辞不好。)一个控制字不能超过32个字符。一个控制字类似以下形式:
/LetterSequence
注意:每个控制字是以反斜杠开始的。
LetterSequence由小写字母字符(a-z)组成。RTF是大小写敏感的。
一个RTF控制字的结束由分隔符标记,以下字符可以作为分隔符:

一个空格。在这种情况下,空格作为关键字的一部分。 
一个数字或连字符(-), 意味着它是一个数字参数。这数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。然而,Word的取值范围可以到达由-31680到31680。Word 允许关键字的小数字参数取值范围在-2,147,483,648到2,147,483,648(特别的,/bin, /revdttm,和一些图像属性)。(再议:a small number of keywords不知所指,应该指这些二进制文件吧。)一个RTF解析器应该能够将一个随意写出的数字字符串转换为一个关键字的合法值。如果一个数值参数紧跟着控制字,这个参数就是控制字的一部分。这时,控制字通过一个空格或非字母数字字符分隔出来,和分隔其他控制字的方式相同。 
除了字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。
如果是第一种情况,空格并不会出现在文档中。分隔符之后的所有字符,包括空格,将被写入文档。基于这个理由,你应该尽在需要的情况下使用空格,不要只是将空格用在分隔RTF代码。
RTF 文件内容
一个 RTF 文件符合以下语法:
'{'

'}' 
本语法是标准的RTF语法,任何RTF查看器都应该可以正确的解释以此语法格式写出的RTF文件。有必要重申的是:RTF查看器没有必要包含所有的控制字,但它必须能够无害的忽略它不知道(或者未使用)的控制字,并且必须能正确的略过被控制字符号标记的部分。然而,生成RTF的编辑器有可能并没完全符合这个语法规范,同样地,RTF查看器应该有足够能力去处理一些细微变更的控制字。虽然如此,如果一个生成RTF的编辑器符合本规范,那么任何一个正确的RTF查看器都应该能够完美的解释它。


RTF文件结构分析及其应用

RTF是一种非常流行的文件结构,很多文字编辑器都支持它,VB等开发工具甚至还提供了Richtxtbox的控件。编写通用工具的程序员应该考虑在自己的软件中加入读写RTF文件的功能,这样就需要对RTF的结构有充分的了解。而现在最重要的信息发布手段莫过于WWW了,在编辑软件中提供RTF到HTML的转换也是程序员应该考虑的事情。尽管WORD中已经有这个功能,但不能因此就对您的顾客说:“先用我的程序存成RTF,然后再用WORD......”。
下面将对RTF文件结构分析及其应用进行讨论。
一、RTF文件结构分析
  RTF的结构并不复杂,但内容繁多,本文不可能一一说明,只能从总体上讨论一下(如果想阅读详尽的RTF文档,则可在Internet上寻找或与笔者联系。)
每个RTF文件都是一个文本文件,显示时由RTF阅读器格式化。文件开始处是{/rtf,它作为RTF文件的标志是必不可少的,RTF阅读器根据它来判断一个文件是否为RTF格式。然后是文件头和正文,文件头包括字体表、文件表、颜色表等几个数据结构,正文中的字体、表格的风格就是根据文件头的信息来格式化的。每个表用一对大括号括起来,当中包含了很多用字符“/”开始的命令。例如,
某个颜色表如下:
  {/colortbl;/red0/green0/blue0;/red0/green0/blue255;/red0/green255/blue255;/red0/green255/blue0;/red255/green0/blue255;/red255/green0/blue0;/red255/green255/blue0;/red255/green255/blue255;/red0/green0/blue128;/red0/green128/blue128;/red0/green128/blue0;/red128/green0/blue128;/red128/green0/blue0;/red128/green128/blue0;/red128/green128/blue128;/red192/green192/blue192;}
  开始时用/colortbl标明大括号内是颜色表,接着是/red0/green0/blue0,
登记了一种颜色,这种颜色的红绿蓝分量都为0。其它表依此类推。文件头之后是正文,正文由版面格式化命令、文字和各种特殊命令组成。其中只有特殊命令用大括号括起来,而版面格式化命令和文字是“开放式”的,从而把文字和命令分离。文件结束时有一个“}”,和第一个“{”对应。在整个文件中,“}”和“{”必须一一对应。这种格式是RTF阅读器和转换器算法的基础。
  RTF格式还有一个特别之处,就是有些字符在命令中有特殊的含义,所以当它们作为文本出现时需要在它们的前面加一个“/”,例如“/”本身就要表示为“//”。事实上,这种形式在大多数编程语言中是很常见的。
  二、算法分析
  本节介绍的算法虽然是针对RTF的读写,但也是一般文件过滤器通用的方法,适用于各种格式文件之间的转换。具体来说就是把各种文件都转换成一种中间格式,再根据要求进行显示或转换。其中有个原则是一定要遵守的:程序必须能过滤掉不认识的格式。各种文件都有其特殊的格式,在转换过程中不可避免会出现格式损失的现象,在算法中要考虑这种情况。对于RTF这类格式化文本文件来说,最重要的是要正确地显示或转换文件的大小、颜色、字体等风格。
因此,在程序中应该用一个数据结构把这些信息存起来,这个结构就是所谓的中间格式,怎样规定悉听尊便。以下是其流程图:
  三、难点分析
  在开发过程中我们遇到了不少问题,其中有两个问题特别有意思。
  第一个问题是中文的表示方式。在RTF中中文用命令的形式表示:“/'内码”。内码就是汉字机内码。不过,请注意:RTF是文本文件,内码
是用ASCII码来储存的,必须把它转换成数字才能使用。例如,“电子与电脑”
在RTF中的形式是:
  /'b5/'e7/'d7/'d3/'d3/'eb/'b5/'e7/'c4/'d4
  第二个是图片的问题,这也是本文的重点。RTF中图片以两种方式存在:第一种方式是直接嵌入,以{/pict开始;第二种方式是作为OLE对象嵌入,这时以{/object开始。当RTF处理器能直接使用OLE时,RTF文件中提供了OLE的数据;否则,文件中直接提供图片的数据,以{/result开始。在使用中最常见的图片格式是内含DIB BITMAP的元文件(METAFILE),这种格式在SDK中没有说明,而且在RTF中是以压缩形式储存的,所以在转换时有一定困难。
  四.RTF格式的扩展
  最后讨论一下RTF格式的扩展。RTF格式作为一个标准应该是统一的,但在
某种情况下进行扩展是必要的。最明显的例子是微软的WORD,它有自己独有的RTF命令。如果想使自己的软件在技术上占有优势,也可以通过创造新的RTF命令来实现。例如,如果你希望在软件中支持DHTML,则可在RTF中嵌入{/dhtml或{/java之类的命令。由于RTF阅读器有过滤不认识命令的功能,所以这样做不会影响RTF文件的通用性。

<续上>
RTF文件格式学习与应用

一、引言

富文本格式(RTF)规范是为了便于在应用程序之间轻松转储格式化文本和图形的一种编码方法。现在,用户可以利用特定转换软件,在不同系统如MS-DOS、Windows、OS/2、Macintosh和Power Macintosh的应用程序之间转移字处理文档。RTF规范提供一种在不同的输出设备、操作环境和操作系统之间交换文本和图形的一种格式。RTF使用ANSI, PC-8, Macintosh, 或IBM PC字符集控制文档的表示法和格式化,包括屏幕显示和打印。凭借RTF规范,不同的操作系统和不同的软件程序创建的文档能够在这些操作系统和应用程序之间传递。
将一个格式化的文件转换为RTF文件的软件称为RTF书写器。RTF书写器用于分离现有文本中的程序控制信息,并且生成一个包含文本和与之相关的RTF组的新文件。将RTF文件转换成格式化文件的软件则称为RTF阅读器。

二、RTF基本语法
RTF文件由未格式化本文、控制字、控制符和组组成。RTF文件没有限制文件的行的最大长度。
控制字是RTF用来标记打印控制符和管理文档信息的一种特殊格式的命令。一个控制字最长32个字符。控制字的使用格式如下: 
/字母序列<分隔符>
注意:每个控制字均以一个反斜杠/开头。字母序列由a~z 的小写字母组成。控制字(或者称为关键字)通常应该不包含任何大写字母。
分隔符标记RTF控制字的结束, 可以是下列各项之一:
·      一个空格,这时空格是控制字的一部份。
·      一个数字或连字符(-), 表示跟随的一个数值参数。该数字序列的长度由其后的一个空格或除了字母和数字的其他字符划定。这个参数可以是正数或者负数,它的取值范围通常是从-32767到32767。
·      任何非字母和数字的其他字符。这种情况下,此分隔字符结束控制字,而它并不属于控制字的一部分。
控制符由一个反斜线/跟随单个非字母字符组成。例如,/~代表一个不换行空格。控制符不需要分隔符。
组由包括在({})中的文本、控制字或控制符组成。左扩符({)表示组的开始,右扩符(})表示组的结束。每个组包括文本和文本的不同属性。RTF文件也能同时包括字体、格式、屏幕颜色、图形、脚注、注释(注解)、文件头和文件尾、摘要信息、域和书签的组合,以及文档、区段、段落和字符的格式属性。如果包括字体、文件、格式、屏幕颜色、校订标记,以及摘要信息组、文档格式属性,则他们一定要在文件的第一纯文本字符之前,这些组形成RTF的文件头。如果包括字体组,则它应该在格式组之前。如果组未使用,可以省略。
对于RTF文件的详细语法及关键字说明请参阅《Rich Text Format (RTF) Specification v1.7》,这里不作更详细的说明。
三、Hello Word

国际惯例,一个Hello Word!演示例子,内容如下:
{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052
{/fonttbl{/f0/fmodern/fprq6/fcharset134 /'cb/'ce/'cc/'e5;}}
{/*/generator Msftedit 5.41.21.2500;}/viewkind4/uc1/pard/lang2052/f0/fs20 Hello World!/par}
该文件分析如下(红色):
1、文件基本属性:
{/rtf1 RTF版本/ansi字符集/ansicpg936简体中文/deff0默认字体0/deflang1033美国英语/deflangfe2052中国汉语
2、字体表:
{/fonttbl{/f0字体0/fmodern/fprq6字体间距为6/fcharset134GB2312国标码 /'cb/'ce/'cc/'e5宋体;}}
3、生成器信息:
{/*/generator Msftedit 5.41.21.2500;}
4、文档属性:
/viewkind4正常视图/uc1单字节/pard默认段落属性/lang2052中国汉语/f0字体0/fs20字体大小20磅
5、正文文本:
Hello World!/par段落标记
}文件结束
注意:在RTF文件中,中文等双字节字符采用其单字节ASCII码序列表示,例如文本“宋体ABC”应该表示为:/'cb/'ce/'cc/'e5ABC,这就是为什么RTF可读性差的原因。
四、文字的更高级表示
掌握了基本文字表述方法后,你一定会试着进一步探索文本更高级的表示方法,如下划线、颜色、粗体、斜体等等,而这些在V1.7规范中都作了详细描述,本文只列出部分常用关键字,以供参考。
l        对于字体表和颜色表的说明:
对于我们在文档中使用的每一个字体和颜色,我们都必须在文档头的字体表和颜色表中预先定义。
字体表定义的例子如下:
{/fonttbl
{/f0/froman/fcharset0/fprq2{/*/panose 02020603050405020304}Times New Roman;}
{/f1/fswiss/fcharset0/fprq2{/*/panose 020b0604020202020204}Arial;}
{/f10/fnil/fcharset2/fprq2{/*/panose 05000000000000000000}Wingdings;}
… …
}
我们在使用字体时,就可以直接指定字体表的一个索引,如:“/f1Happy”表示字体为Arial 的文本Happy。如果我们想加入其他字体,如“华文中宋”,那么只需要在字体表中加入该字体说明,并在需要时引用该字体索引值即可。方法为(华文中宋的ASCII串为“/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce”):{f222/fnil/fcharset134/fprq2/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce;},然后通过/f222来引用该字体即可。
颜色表定义的例子如下:
{/colortbl;/red0/green0/blue0;/red0/green0/blue255;/red0/green255/blue255;/red0/green255/blue0;/red255/green0/blue255;/red255/green0/blue0;/red255/green255/blue0;/red255/green255/blue255;/red0/green0/blue128;/red0/green128/blue128;/red0/green128/blue0;/red128/green0/blue128;/red128/green0/blue0;/red128/green128/blue0;/red128/green128/blue128;/red192/green192/blue192; … …}
颜色表中每个颜色值采用RGB格式书写,每个颜色用分号格开,注意第一个颜色值/c0为空,表示系统默认颜色(一般为黑色)。依次为:/0、/1、/2、… …。我们在使用颜色时(如字体颜色)就可以指定某一个颜色索引值,如“/cf2Sunday”表示字体颜色为RGB(0,0,255)蓝色的文字Sundy。“/cb6ABC”表示字体背景色为RGB(255,0,0)的文字“ABC”。如果我们需要加入其他颜色值,只需要在颜色表中加入颜色定义,并通过相应的索引值来引用它即可。
l        字符底纹语法如下:
控制字     涵义
==============================================================
/chbrdr    字符边框(每边均有边框)。
/chshdngN    字符阴影。参数N的值文字阴影的百分比。
/chcfpatN   N是背景图案的颜色,指定文档颜色表的一个索引。
/chcbpatN   N是填充色,指定文档颜色表的一个索引。
/chbghoriz   指定水平线文本背景图案。
/chbgvert   指定垂直线文本背景图案。
/chbgfdiag   指定正向对角线文本背景图案()。
/chbgbdiag   指定反向对角线文本背景图案()。
/chbgcross   指定十字线文本背景图案。
/chbgdcross   指定对角十字线文本背景图案。
/chbgdkhoriz   指定粗水平线文本背景图案。
/chbgdkvert   指定粗垂直线文本背景图案。
/chbgdkfdiag   指定粗前斜线文本背景图案()。
/chbgdkbdiag   指定粗后斜线文本背景图案()。
/chbgdkcross   指定粗十字线文本背景图案。
/chbgdkdcross   指定粗对角十字线文本背景图案。
假设我们希望得到背景为水平线、字体为华文中宋(字体索引为222)、颜色为红色(颜色索引为6)的文本“星期天”,则只需输入:/f222/cf6/chbghoriz/'bb/'aa/'ce/'c4/'d6/'d0/'cb/'ce 即可。
l        字符下划线语法如下:

控制字      涵义
=========================================================================
/ul     连续的下划线。/ul0关闭所有下划线。
 
/ulcN     下划线颜色。(注意:大写N表示一个索引数字,下同)
 
/uld     点下划线。
 
/uldash     短划下划线。
 
/uldashd    点划下划线。

/uldashdd    双点划下划线。

/uldb     双下划线。

/ulhwave    加重波浪下划线。

/ulldash     长划下划线。
 
/ulnone     停止所有下划线。
 
/ulth     粗下划线。

/ulthd     粗点下划线。

/ulthdash     粗短划下划线。

/ulthdashd     粗点划下划线。

/ulthdashdd     粗双点划下划线。

/ulthldash     粗长划下划线。

/ululdbwave    双波浪下划线。

/ulw     字下加下划线。

/ulwave     波浪下划线。
  
下划线语法与前面底纹的使用相同。

l        其他文本显示高级属性:
控制字      涵义
====================================================
/outl     边框。/ outl 0关闭之。
 
/scaps     小体大写字母。/ scaps 0关闭之。
 
/shad     阴影。/ shad 0关闭之。
 
/strike     删除线。/strike0关闭之。
 
/striked1    双删除线。/striked0关闭之。
 
/sub     按照字体信息的下标文本和缩小点的尺寸。
 
/super     按照字体信息的上标文本和缩小点的尺寸。

l        对齐方式语法如下:
控制字      涵义
======================================================================
/qc     居中对齐。

/qj     两端对齐。

/ql     左对齐(默认)。

/qr     右对齐。
 
/qd     分散对齐。
 
/qkN     使用Kashida规则调整行百分比(0-低、10-中、20-高)。

/qt     .用于泰文的分散对齐。

l        文本缩进语法如下:
控制字      涵义
========================================================================
/fiN     首行缩进(默认为0)。
 
/cufiN     采用字符单位的百分比的首行缩进值,用以覆盖/fiN的设置,虽然它们可以设为相同值。
 
/liN     左端缩进(默认为0)。

/linN     从左至右段落的左端缩进值;如果在从右至左段落则表示右端缩进值(默认为0)。/linN定义了段前空格数。

/culiN     采用字符单位的百分比的左端缩进值,与/linN一样,它用以覆盖/liN和/linN的设置,虽然它们可以设为相同值。

/riN     右缩进(默认为0)。

/rinN     从左至右段落的右端缩进值;如果在从右至左段落则表示左端缩进值(默认为0)。/rinN定义了段前空格数。

/curiN     采用字符单位的百分比的右端缩进值,与/rinN一样,它用以覆盖/riN和/rinN的设置,虽然它们可以设为相同值。

/adjustright    当文档网格被定义时自动调整右缩进。
l        文本间距语法如下:
/sbN     段后间隔(默认为0)。

/saN     段前间隔(默认为0)。
 
/sbautoN    自动段前间隔:

 0 段前间距取决于/sb。

 1  自动段前间距(忽略/sb)。

 默认为0。
 
/saautoN    自动段后间隔:

 0 段后间距取决于/sa。
 1 自动段后间距(忽略/sa)
 默认为0。

/lisbN   采用字符单位的百分比的段前间隔值,用以覆盖/sbN的设置,虽然它们可以设为相同值。

/lisaN   采用字符单位的百分比的段后间隔值,用以覆盖/saN的设置,虽然它们可以设为相同值。

/slN   行间距。如果没有使用该控制字或者使用/sl0,则行间距将根据行间字符最高值自动取值。若N为一个正值,则该值将仅仅在该值大于行间字符最高值时才使用(否则,使用字符最高值);分N是一个负值,即使在其小于行间字符最高值时,总是使用N的绝对值。
 
/slmultN  多倍行间距。指出当前行间距是单倍行距的倍数。该控制字只能跟在/sl后,联合作用。
 0       “最小”或者是“精确”的行距
 1       多倍行距,相对于“单倍”行距。

/nosnaplinegrid   取消对齐网格线。

五、图片的表示方式

摸清RTF中图片的表示颇费了一番周折,下面的分析希望能够加速你的学习进程。一个RTF图片数据通常直接嵌入文件中,这些图象可以是16进制(默认的)或2进制格式。图象属于目标引用,由/pict 控制字开始。如后面的例子中将描述的,/pict关键字应在/*/shppict引用控制关键字之后。
一个图象的例子如下:
{/*/shppict{/pict 
{/*/picprop/shplid1025{/sp{/sn shapeType}{/sv 75}}{/sp{/sn fFlipH}{/sv 0}}{/sp{/sn fFlipV}{/sv 0}}{/sp{/sn pibFlags}{/sv 2}}{/sp{/sn fLine}{/sv 0}}{/sp{/sn fLayoutInCell}{/sv 1}}}
/picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/jpegblip/bliptag-728883813
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f… …}}
{/nonshppict {/pict /picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/wmetafile8/bliptag-728883813/blipupi72
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000… …}}
其分析如下(红色):
{/*/shppict图片(引用)
{/pict图片开始
绘图对象属性(这个组可以省略):
{/*/picprop表示这里是应用于一个内嵌图象的形状属性/shplid1025标识每个图形的唯一数值
{/sp绘图对象属性定义
{/sn shapeType}{/sv 75}} 图片类型为相框
{/sp{/sn fFlipH}{/sv 0}} 水平翻转:False
{/sp{/sn fFlipV}{/sv 0}} 垂直翻转:False
{/sp{/sn pibFlags}{/sv 2}} 链接图片标志
{/sp{/sn fLine}{/sv 0}}具有线条:False
{/sp{/sn fLayoutInCell}{/sv 1}}允许图形锚点定位在单元格内部:True
}绘图对象属性定义结束
图片属性:
/picscalex100水平缩放比例/picscaley100垂直缩放比例
/piccropl0左端剪切值=0/piccropr0右端剪切值=0/piccropt0上端剪切值=0/piccropb0下端剪切值=0
/picw4516图片的像素宽度/pich4516图片的像素高度/picwgoal2560图象期望宽度/pichgoal2560图象期望高度/jpegblip图片源为一个JPEG文件/bliptag图象ID标识-728883813
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
图片16进制数据:
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f}16进制图片数据结束
}
兼容性wMetaFile文件内容(可用省略):
{/nonshppict只用于兼容,不读取
{/pict图片开始/picscalex100/picscaley100/piccropl0/piccropr0/piccropt0/piccropb0/picw4516/pich4516/picwgoal2560/pichgoal2560/wmetafile8/bliptag-728883813/blipupi72
{/*/blipuid d48e1d9b2268ef9f2741709749fb439c}
下面是MetaFile类型的16进制数据:
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000
}MetaFile类型16进制图片数据结束
}
为了简化分析,我们除去所以可以省略的内容,则一副图片可以这样表示:
{/*/shppict{/pict piccropl0/piccropr0/piccropt0/piccropb0/picw宽度/pich高度/picwgoal显示宽度/pichgoal显示高度/jpegblipJPEG类型/bliptag-728883813ID值(为一个负的长整形值)
下面是该图片的实际16进制数据:
ffd8ffe0001… …}}
六、表格基本表示方法

上面对文本和图片都进行了分析,相信你已经对RTF文件格式有了一定体会,接下来说明RTF文件中表的表示方法。表的定义稍显复杂,不过还是有规律可循的。不存在RTF表组,实际上表由段落属性来描述。一个表表现为多个表行的顺序排列。一个表行是一个由不同单元格组成的段落序列。简言之,表格由行组成,行由单元格组成。不管有多复杂的表格,它都是通过一行接一行的描述来实现的,包括表格的嵌套。表行从控制字/trowd开始,/row结束。包含在一个表行中的每个段落必须指定/intbl控制字或者从前一段落继承。一个单元内可能有多个段落;单元由单元格标志(/cell控制字)结束,行由行标志(/row控制字)结束。表行也可以被绝对定位。此时,表行的每个段落必须具有相同的定位控制字。表的属性可以从前一行继承;因此,连续的表行可以通过单一的来定义。
一个简单表格例子如下: 
1,1  1,2  1,3 
2,1  2,2  2,3
 RTF内容如下:
/trowd /irow0/irowband0/ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/pard/plain /qj /li0/ri0/nowidctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0/yts15 
/fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /hich/af0/dbch/af13/loch/f0 1,1/cell /hich/af0/dbch/af13/loch/f0 1,2/cell /hich/af0/dbch/af13/loch/f0 1,3/cell }/pard/plain 
/ql /li0/ri0/widctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0 /fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /trowd /irow0/irowband0/ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/row }/pard/plain /qj /li0/ri0/nowidctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0/yts15 
/fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /hich/af0/dbch/af13/loch/f0 2,1/cell /hich/af0/dbch/af13/loch/f0 2,2/cell /hich/af0/dbch/af13/loch/f0 2,3/cell }/pard/plain 
/ql /li0/ri0/widctlpar/intbl/aspalpha/aspnum/faauto/adjustright/rin0/lin0 /fs21/lang1033/langfe2052/kerning2/loch/af0/hich/af0/dbch/af13/cgrid/langnp1033/langfenp2052 {/insrsid2113686 /trowd /irow1/irowband1/lastrow /ts15/trgaph108/trleft-108/trbrdrt
/brdrs/brdrw10 /trbrdrl/brdrs/brdrw10 /trbrdrb/brdrs/brdrw10 /trbrdrr/brdrs/brdrw10 /trbrdrh/brdrs/brdrw10 /trbrdrv/brdrs/brdrw10 
/trftsWidth1/trftsWidthB3/trautofit1/trpaddl108/trpaddr108/trpaddfl3/trpaddft3/trpaddfb3/trpaddfr3/tblrsid2113686/tbllkhdrrows/tbllklastrow/tbllkhdrcols/tbllklastcol /clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr
/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2840/clshdrawnil /cellx2732/clvertalt/clbrdrt/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx5573/clvertalt/clbrdrt
/brdrs/brdrw10 /clbrdrl/brdrs/brdrw10 /clbrdrb/brdrs/brdrw10 /clbrdrr/brdrs/brdrw10 /cltxlrtb/clftsWidth3/clwWidth2841/clshdrawnil /cellx8414/row }
是不是很复杂?不过没关系,我们通过对其进行分段,并加入适当注释,你就会对RTF文件中的表结构一目了然。首先需要声明的是,RTF1.7规范中规定,表行的格式如下:( + /row) | ( + /row) | (+ /row),目前Word2003采用的方式就是第一种,即“定义+内容+重复定义”,如此一来就会有很大的数据冗余,这就是为什么Word2003的一个简单文档都会很大的原因,不过为了兼容性考虑,这样处理也是必要的。其定义也由“行定义+单元格定义”组成,其中单元格定义可用重复。
分析代码如下(红色):


表格行1
/trowd表行1开始
表格属性
/trgaph108表中单元格半间距/trleft-108表的最左边位置
行边框设置
/trbrdrt行的上边框/brdrs单倍厚度/brdrw10线宽
/trbrdrl行的左边框/brdrs单倍厚度/brdrw10线宽
/trbrdrb行的下边框/brdrs单倍厚度/brdrw10线宽
/trbrdrr行的右边框/brdrs单倍厚度/brdrw10线宽
单元格1边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx2732单元格右边界
单元格2边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx5573单元格右边界
单元格3边框设置
/clbrdrt单元格上边框/brdrw15线宽/brdrs单倍厚度
/clbrdrl单元格左边框/brdrw15线宽/brdrs单倍厚度
/clbrdrb单元格下边框/brdrw15线宽/brdrs单倍厚度
/clbrdrr单元格右边框/brdrw15线宽/brdrs单倍厚度
/cellx8414单元格右边界
行1数据
/pard重置段落属性/intbl段落是表的一部分/kerning2紧缩字符尺寸/f0字体0/fs21尺寸21 
1,1 1,1 /cell表单元格1结束
1,2 1,2 /cell表单元格2结束
1,3 1,3 /cell表单元格3结束
/f1字体1
/row表行1结束
/f0字体0
表格行2
/trowd表行2开始
/trgaph108表中单元格半间距/trleft-108表的最左边位置
行边框设置
/trbrdrt/brdrs/brdrw10 
/trbrdrl/brdrs/brdrw10 
/trbrdrb/brdrs/brdrw10 
/trbrdrr/brdrs/brdrw10 
单元格1边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx2732
单元格2边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx5573
单元格3边框设置
/clbrdrt/brdrw15/brdrs
/clbrdrl/brdrw15/brdrs
/clbrdrb/brdrw15/brdrs
/clbrdrr/brdrw15/brdrs 
/cellx8414
行2数据
/intbl 段落是表的一部分
2,1 2,1/cell表单元格1结束
2,2 2,2/cell表单元格2结束
2,3 2,3/cell表单元格3结束
/f1字体1
/row表行2结束
至此,你应该对RTF表格输出有一定认识了吧。当然在表格中插入图片、嵌入表格等的实现方法同理,嵌入的图片可以等同于一段文本来处理,但是嵌套表格的实现可能比较复杂,因为它涉及段落文本嵌套层次等高级问题,这里不再详述,有兴趣的读者可以参考《Rich Text Format (RTF) Specification v1.7》。

七、小结:RTF文档基本结构
通过对RTF文件的分析,我们得出一个RTF文件基本结构如下:
     RTF文件

文件头


     RTF版本/rtf
     字符集
     默认字体区域设置
     默认字体号/deff?
     字体表
     文件表?
     颜色表?
     样式表?
     编目表?
         编目表{ /*/listtable }
         编目替换表{ /*/listoverridetable }
     段落组属性{ /*/pgptbl }
     跟踪修订?
     RSID表?
     生成器信息?
文档区
     文档信息区?
         标题?<br>          主题<subject>?<br>          作者<author>?<br>          经理<manager>?<br>          公司<company>?<br>          最后修改者<operator>?<br>          文档类别<category>?<br>          关键字<keywords>?<br>          注释<comment>?<br>          文档的版本号/version?<br>          Word摘要信息中的注释<doccomm>?<br>          内部版本号/vern?<br>          创建时间<creatim>?<br>          修订时间<revtim>?<br>          最后打印时间<printim>?<br>           备份时间<buptim>?<br>           总编辑时间(单位:分钟)/edmins?<br>          页数/nofpages?<br>          字数/nofwords?<br>          包含空格的总字符数/nofchars?<br>          内部ID号/id?<br>      文档格式属性<docfmt>*<br>          节文本<section>+<br>               节格式属性<secfmt>*<br>               页眉页脚设置<hdrftr>?<br>          段落文本<para>+<br>               文本<textpar>|<br>                    项目符号与编号<pn>?<br>                    段落边框<brdrdef>?<br>                    段落格式属性<parfmt>*<br>                    定位对象与边框<apoctl>*<br>                    制表位设置<tabdef>?<br>                    段落底纹<shading>?<br>                    隐藏与否(/v /spv)?<br>               表格<row><br>                    行开始/trowd<br>                    行定义<tbldef><br>                    单元格<cell>+<br>                        单元格定义+<br>                        单元格内容+<br>                    重复行定义<tbldef><br>                    行结束/row<br>          字符文本<char>+<br>          图片<pict><br>               图片开始{/*/shppict {/pict  }<br>               图片属性<br>               图片数据<br>          对象<obj><br>          绘图对象/shp<br>          脚注/footnote<br>          注释<annot><br>          域<field></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1707908112171741184"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Rtf格式分析)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1943183809205825536.htm" title="Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证" target="_blank">Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证</a> <span class="text-muted">PythonicCC</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a> <div>1.JSON数据格式详解1.1什么是JSON?JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,具有以下特点:独立于语言,几乎所有编程语言都支持易于人阅读和编写易于机器解析和生成基于文本,比XML更简洁1.2JSON基本格式对象格式{"name":"rose","age":20}使用大括号{}包裹键值对形式,键必须用双引号包裹多个键值对用逗号分隔数组格式["j</div> </li> <li><a href="/article/1943179523256283136.htm" title="有关慢查询SQL优化的思路" target="_blank">有关慢查询SQL优化的思路</a> <span class="text-muted">Yilena</span> <a class="tag" taget="_blank" href="/search/%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF%E6%96%B9%E6%A1%88%E5%88%86%E6%9E%90%E4%BB%A5%E5%8F%8A%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88/1.htm">业务场景方案分析以及优化方案</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/%E4%BC%98%E5%8C%96/1.htm">优化</a> <div>目录一、什么是慢查询?二、如何定位?(一)通过命令行临时开启(二)通过配置文件永久开启(三)测试日志是否正常工作(四)分析日志三、慢查询常见原因四、优化思路(一)索引1.原因其一:未设置索引2.原因其二:索引失效3.原因其三:索引覆盖不全(二)SQL语句1.原因其一:返回结果存在冗余字段2.原因其二:子查询3.原因其三:多表JOIN过多4.原因其四:避免排序5.原因其五:避免使用NOTIN和!=(</div> </li> <li><a href="/article/1943176626019823616.htm" title="3DXML 转换为 SOLIDWORKS 技术指南:含迪威模型网在线转换方案" target="_blank">3DXML 转换为 SOLIDWORKS 技术指南:含迪威模型网在线转换方案</a> <span class="text-muted"></span> <div>在工业设计协同工作中,不同CAD软件的文件格式转换是常见需求。3DXML作为DassaultSystèmes旗下CATIA软件的轻量型三维数据格式,因体积小、便于传输,被广泛用于模型预览和跨平台共享。但当需要在SOLIDWORKS中进行深入设计或工程分析时,需将3DXML格式转换为SOLIDWORKS兼容格式。本文将为技术人员和学生详细介绍转换全流程,并推荐实用的在线转换平台——迪威模型网。一、3</div> </li> <li><a href="/article/1943173978705162240.htm" title="【Flask】问题RuntimeError: A ‘SQLAlchemy’ instance has already been registered on this Flask app的处理方法" target="_blank">【Flask】问题RuntimeError: A ‘SQLAlchemy’ instance has already been registered on this Flask app的处理方法</a> <span class="text-muted">Tzq@2018</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a> <div>【Flask】RuntimeError:A‘SQLAlchemy’instancehasalreadybeenregisteredonthisFlaskapp.Importandusethatinstanceinstead.一、解决方案1.1、单例模式管理SQLAlchemy实例1.2、正确初始化应用1.3、模型文件中使用全局实例二、错误原因分析三、完整正确代码示例四、关键注意事项五、替代方案:延</div> </li> <li><a href="/article/1943168435072593920.htm" title="Android网络层架构:统一错误处理的问题分析到解决方案与设计实现" target="_blank">Android网络层架构:统一错误处理的问题分析到解决方案与设计实现</a> <span class="text-muted">wzj_what_why_how</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Android%E2%80%94%E2%80%94%E6%9E%B6%E6%9E%84%E5%92%8C%E8%AE%BE%E8%AE%A1/1.htm">Android——架构和设计</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>前言在Android项目开发中,我们经常遇到需要统一处理某些特定状态码的场景。本文分享一个项目中遇到的4406状态码(实名认证)处理不统一问题,从问题分析到完整解决方案,提供一套可复用的架构设计模式。目录前言问题分析不同框架的回调处理机制解决方案关键技术细节添加应用拦截器循环依赖问题与回调接口模式问题分析解决方案:回调接口模式ResponseBody流管理问题现象原因总结源码分析总结其设计原理重复</div> </li> <li><a href="/article/1943165411201708032.htm" title="【网络协议】TCP连接的建立和释放" target="_blank">【网络协议】TCP连接的建立和释放</a> <span class="text-muted"></span> <div>TCP连接的建立和释放TCP首部格式TCP报文段的前20个字节是固定的,后4N个字节为根据需要可增加的选项首部各字段的意义如下:源端口和目的端口:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接。另外通过目的端口来确定TCP将数据报交付于哪个应用程序,从而实现功能。序列号:占4个字节,由于TCP是面向字节流的,在TCP中传送的每一个字节都按顺序编号,首部中的序号字段(seq)是指本</div> </li> <li><a href="/article/1943163141722533888.htm" title="基于Deepseek+RAG构建企业知识库:文档预处理与数据整理" target="_blank">基于Deepseek+RAG构建企业知识库:文档预处理与数据整理</a> <span class="text-muted">大势下的牛马</span> <a class="tag" taget="_blank" href="/search/%E6%90%AD%E5%BB%BA%E6%9C%AC%E5%9C%B0gpt/1.htm">搭建本地gpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/RAG/1.htm">RAG</a><a class="tag" taget="_blank" href="/search/Deepseek/1.htm">Deepseek</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%BA%93/1.htm">知识库</a> <div>在当今数字化时代,企业知识库的构建对于知识管理和高效决策至关重要。基于Deepseek+RAG(Retrieval-AugmentedGeneration)技术构建企业知识库,能够有效整合企业内外部知识资源,实现知识的快速检索和精准应用。而在这一过程中,文档预处理与数据整理是关键的基础环节,直接关系到知识库的质量和后续应用效果。一、文件预处理:格式转换与数据清洗(一)支持格式与转换要求优先格式:在</div> </li> <li><a href="/article/1943160236982464512.htm" title="【macOS】【Swift】【RTF】黑色文字在macOS深色外观下看不清的解决方法" target="_blank">【macOS】【Swift】【RTF】黑色文字在macOS深色外观下看不清的解决方法</a> <span class="text-muted">goodmao</span> <a class="tag" taget="_blank" href="/search/macos/1.htm">macos</a> <div>【macOS】【Swift】【RTF】黑色文字在macOS深色外观下看不清的解决方法遇到这个问题,Cursor高效率地忙乎了一个小时,给出了很多方案并做了修改,但都没生效。kimi还给出了:在深色外观下,将黑色文字转成白色;保存时,再反转的方法。我都感觉:不是我当前App所需要的效果。==========最后,找到很简单的方法,一行代码即可。当macOS的外观设置为深色时,RTF文件读取后,如果文</div> </li> <li><a href="/article/1943157086410043392.htm" title="PageRank:互联网的马尔可夫链平衡态" target="_blank">PageRank:互联网的马尔可夫链平衡态</a> <span class="text-muted">大千AI助手</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/OTHER/1.htm">OTHER</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E6%9D%A1%E4%BB%B6%E6%A6%82%E7%8E%87/1.htm">条件概率</a><a class="tag" taget="_blank" href="/search/%E8%B4%9D%E5%8F%B6%E6%96%AF/1.htm">贝叶斯</a><a class="tag" taget="_blank" href="/search/PageRank/1.htm">PageRank</a><a class="tag" taget="_blank" href="/search/%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E9%93%BE/1.htm">马尔科夫链</a><a class="tag" taget="_blank" href="/search/MC/1.htm">MC</a> <div>本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!PageRank算法本质上是一个在网页图上定义的离散时间马尔可夫链(DTMC),其核心思想是将网页间的链接关系转化为状态转移概率。以下是详细分析:一、马尔可夫链的核心要素在PageRank中的体现马尔可夫链要素PageRank对应数学描述状态空间网页集</div> </li> <li><a href="/article/1943155065854423040.htm" title="DIDCTF-22蓝帽杯初赛" target="_blank">DIDCTF-22蓝帽杯初赛</a> <span class="text-muted">小丑001.</span> <a class="tag" taget="_blank" href="/search/DIDCTF/1.htm">DIDCTF</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a> <div>手机取证_1题目描述现对一个苹果手机进行取证,请您对以下问题进行分析解答。627604C2-C586-48C1-AA16-FF33C3022159.PNG图片的分辨率是?(答案参考格式:1920×1080)注意:中间为乘号×,不是字母xflag:360×360手机取证_2题目描述姜总的快递单号是多少?(答案参考格式:abcABC123)flag:SF1142358694796网站取证_1题目描述据</div> </li> <li><a href="/article/1943154903992037376.htm" title="python视频工具包 ffmpeg 使用示例" target="_blank">python视频工具包 ffmpeg 使用示例</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/pythonffmpeg/1.htm">pythonffmpeg</a> <div>1.简介FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,提供了录制、转换以及流化音视频的完整解决方案。2.ffmpeg的常用方法将某文件下所有ts文件按顺序合并,转换成MP4格式存储:importffmpegdeftest2():ts_folder='path/ts_files/ceshi/'output_mp4="pa</div> </li> <li><a href="/article/1943153427404091392.htm" title="LeetCode 刷题:数据结构与算法的实战经验分享" target="_blank">LeetCode 刷题:数据结构与算法的实战经验分享</a> <span class="text-muted"></span> <div>LeetCode刷题:数据结构与算法的实战经验分享关键词:LeetCode、数据结构、算法、刷题经验、实战摘要:本文将围绕LeetCode刷题展开,深入探讨数据结构与算法在实际刷题过程中的应用。通过分享实战经验,帮助读者更好地理解和掌握数据结构与算法知识,提升解题能力。文章将从背景介绍入手,阐述刷题的目的和意义,接着详细解释核心概念,分析它们之间的关系,然后介绍核心算法原理和具体操作步骤,结合数学</div> </li> <li><a href="/article/1943153427890630656.htm" title="量化价值投资中的深度学习技术:TensorFlow实战" target="_blank">量化价值投资中的深度学习技术:TensorFlow实战</a> <span class="text-muted"></span> <div>量化价值投资中的深度学习技术:TensorFlow实战关键词:量化价值投资,深度学习,TensorFlow,股票预测,因子模型,LSTM神经网络,量化策略摘要:本文将带你走进"量化价值投资"与"深度学习"的交叉地带,用小学生都能听懂的语言解释复杂概念,再通过手把手的TensorFlow实战案例,教你如何用AI技术挖掘股票市场中的价值宝藏。我们会从传统价值投资的痛点出发,揭示深度学习如何像"超级分析</div> </li> <li><a href="/article/1943153175238340608.htm" title="小程序领域设计中的用户体验优化" target="_blank">小程序领域设计中的用户体验优化</a> <span class="text-muted">小程序开发2020</span> <a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/ux/1.htm">ux</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>小程序领域设计中的用户体验优化:从"用得上"到"用得爽"的进阶指南关键词:小程序设计、用户体验优化、交互流畅性、性能调优、用户行为分析摘要:本文以"用户体验优化"为核心,结合小程序的特性与用户真实使用场景,系统讲解从性能加速到交互设计的全链路优化方法。通过生活案例类比、技术原理拆解与实战代码演示,帮助开发者/设计师理解"用户体验"的底层逻辑,掌握可落地的优化技巧,最终实现小程序从"能用"到"好用"</div> </li> <li><a href="/article/1943145363674296320.htm" title="数据结构实验解析(C++版)——实验一 复杂度分析" target="_blank">数据结构实验解析(C++版)——实验一 复杂度分析</a> <span class="text-muted">拯救三金</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>目录一、实验例题例题1例题2二、实验原理与背景知识1、实验原理2、背景知识三、解题思路与算法1、解题思路2、算法四、代码实现例题1代码例题2代码五、实验结果分析与总结1、实验结果分析2、该实验与数据结构的联系一、实验例题例题1时间空间限制时间限制:1SEC空间限制:128MB问题描述分析以下代码:for(i=1;iusingnamespacestd;intmain(){longlongn;//输入</div> </li> <li><a href="/article/1943141711505059840.htm" title="Hive 事务表(ACID)问题梳理" target="_blank">Hive 事务表(ACID)问题梳理</a> <span class="text-muted"></span> <div>文章目录问题描述分析原因什么是事务表概念事务表和普通内部表的区别相关配置事务表的适用场景注意事项设计原理与实现文件管理格式参考博客问题描述工作中需要使用pyspark读取Hive中的数据,但是发现可以获取metastore,外部表的数据可以读取,内部表数据有些表报错信息是:AnalysisException:org.apache.hadoop.hive.ql.metadata.HiveExcept</div> </li> <li><a href="/article/1943141585260703744.htm" title="使用FinancialDatasets工具包进行财务数据分析" target="_blank">使用FinancialDatasets工具包进行财务数据分析</a> <span class="text-muted">Zbb159</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a> <div>##技术背景介绍在现代金融分析中,获取准确且及时的财务数据是至关重要的。FinancialDatasets提供了一个强大的API,可以获取超过16,000个股票的财务数据,时间跨度超过30年。通过与OpenAI的集成,我们能够创建智能化的财务分析助手,为投资者提供深度的市场洞察。##核心原理解析FinancialDatasets工具包通过RESTAPI接口访问财务数据,为每个公开交易的公司提供详细</div> </li> <li><a href="/article/1943138810095267840.htm" title="Python 爬虫实战:抓取华尔街日报付费文章摘要的全方位指南" target="_blank">Python 爬虫实战:抓取华尔街日报付费文章摘要的全方位指南</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>引言在全球化的信息时代,获取高质量的新闻内容对于研究、投资和决策具有重要意义。《华尔街日报》(TheWallStreetJournal,简称WSJ)作为国际知名的财经媒体,其文章内容备受关注。然而,WSJ的大部分内容属于付费订阅,普通用户无法直接访问。本文将深入探讨如何使用Python爬虫技术,结合最新的工具和方法,抓取WSJ的付费文章摘要。一、了解目标网站结构1.1WSJ网站结构分析WSJ的官方</div> </li> <li><a href="/article/1943138683486007296.htm" title="Python爬虫实战:爬取ETF基金持仓变化" target="_blank">Python爬虫实战:爬取ETF基金持仓变化</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>1.项目背景ETF(Exchange-TradedFund,交易型开放式指数基金)作为一种在交易所上市交易的基金,其持仓信息对于投资者具有重要参考价值。了解ETF的持仓变化,可以帮助投资者判断市场趋势和资金流向。本文将通过Python爬虫技术,自动化地获取ETF基金的持仓变化数据,进行存储和分析。2.技术选型与环境准备2.1技术选型编程语言:Python3.8+爬虫框架:Scrapy数据解析:Be</div> </li> <li><a href="/article/1943138179095785472.htm" title="【数据结构】复杂度分析" target="_blank">【数据结构】复杂度分析</a> <span class="text-muted"></span> <div>目录一、算法1.基本概念2.描述方法3.算法效率二、算法的时间复杂度三、算法的空间复杂度一、算法1.基本概念通俗的讲,算法是解决问题的方法,比如在现实生活中一道菜谱,一个安装轮椅的操作指南等。严格的说,算法是对特定问题求解步骤的一种描述,是指令的有限序列。算法具有的基本特性有:(1)有穷性。一个算法必须总是在执行有穷步之后结束,且每一步都在有求时间内完成。(2)确定性。算法中的每一条指令必须有确切</div> </li> <li><a href="/article/1943133896325525504.htm" title="展锐平台(Android15)WLAN热点名称修改不生效问题分析" target="_blank">展锐平台(Android15)WLAN热点名称修改不生效问题分析</a> <span class="text-muted"></span> <div>前言在展锐AndroidV项目开发中,需要修改softAp/P2P热点名称时,发现集成GMS后直接修改framework层代码无效。具体表现为:修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法编译烧录后修改不生效问题根源在于:Wi-Fi模块在AndroidS(12)及以上版本已纳入Mainline模块Mai</div> </li> <li><a href="/article/1943132887670910976.htm" title="nRF52832 低功耗设计与优化" target="_blank">nRF52832 低功耗设计与优化</a> <span class="text-muted">mftang</span> <a class="tag" taget="_blank" href="/search/zephyr%E6%9E%B6%E6%9E%84%E8%93%9D%E7%89%99%E5%BA%94%E7%94%A8%E7%AC%94%E8%AE%B0/1.htm">zephyr架构蓝牙应用笔记</a><a class="tag" taget="_blank" href="/search/Nordic/1.htm">Nordic</a><a class="tag" taget="_blank" href="/search/MCU%E7%B3%BB%E5%88%97%E7%AC%94%E8%AE%B0/1.htm">MCU系列笔记</a><a class="tag" taget="_blank" href="/search/Zephyr/1.htm">Zephyr</a><a class="tag" taget="_blank" href="/search/RTOS/1.htm">RTOS</a><a class="tag" taget="_blank" href="/search/zephyr%E6%9E%B6%E6%9E%84%E8%93%9D%E7%89%99%E5%BA%94%E7%94%A8%E7%AC%94%E8%AE%B0/1.htm">zephyr架构蓝牙应用笔记</a> <div>目录概述1技术背景2优化策略2.1系统级电源管理2.2时钟系统优化2.3GPIO配置优化3蓝牙协议栈优化3.1连接参数优化3.2广播优化4电源管理实践4.1功耗状态转换图4.2典型功耗分布5低功耗设计最佳实践5.1事件驱动架构5.2定时任务管理5.3数据批处理6高级优化技术6.1电压调节优化6.2RAM保持策略6.3动态功耗分析7功耗测量与验证8常见问题解决8.1功耗高于预期8.2唤醒延迟过长8.</div> </li> <li><a href="/article/1943129860310364160.htm" title="心理健康语音分析AI模型:开启心理评估新时代" target="_blank">心理健康语音分析AI模型:开启心理评估新时代</a> <span class="text-muted">AI大模型应用实战</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/1.htm">语音识别</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>心理健康语音分析AI模型:开启心理评估新时代关键词:心理健康评估、语音信号处理、情感计算、AI模型、多模态融合摘要:传统心理评估依赖量表问卷和人工观察,存在主观性强、效率低、难以实时监测等局限。本文将带您走进“心理健康语音分析AI模型”的世界,从基础概念到核心技术,从算法原理到实战案例,揭秘AI如何通过“听声音”读懂心理状态,开启心理评估的智能化新时代。背景介绍目的和范围心理健康问题已成为全球公共</div> </li> <li><a href="/article/1943129862336212992.htm" title="Python 领域 pytest 的测试用例的可维护性设计" target="_blank">Python 领域 pytest 的测试用例的可维护性设计</a> <span class="text-muted"></span> <div>Python领域pytest的测试用例的可维护性设计关键词:pytest、测试用例、可维护性、测试框架、自动化测试、测试设计模式、重构摘要:本文深入探讨了如何在Python测试框架pytest中设计可维护的测试用例。我们将从测试用例可维护性的核心原则出发,分析pytest的特性和最佳实践,介绍多种提高测试代码可维护性的设计模式和技巧。文章包含实际代码示例、项目实战案例以及可维护性评估指标,帮助开发</div> </li> <li><a href="/article/1943129734015676416.htm" title="数据链路层" target="_blank">数据链路层</a> <span class="text-muted">Ragef</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/MTU/1.htm">MTU</a><a class="tag" taget="_blank" href="/search/ARP/1.htm">ARP</a> <div>目录以太网以太网帧格式MTUMTU与IP、UDP\TCP的影响IPUDPTCPARP协议ARP工作流程ARP数据报的格式以太网"以太网"不是一种具体的网络,而是一种技术标准以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等以太网帧格式帧格式如下图所示:目的地址:接收方的MAC地址,用于标识帧的目的地。源地址:发送方的MAC地址,用于标识帧的来源。类型:这个字段指示帧中封装</div> </li> <li><a href="/article/1943128851630583808.htm" title="Hera调度系统运行时架构源码分析" target="_blank">Hera调度系统运行时架构源码分析</a> <span class="text-muted">Code Monkey’s Lab</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/1.htm">源码分析</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/hera/1.htm">hera</a><a class="tag" taget="_blank" href="/search/%E8%B0%83%E5%BA%A6%E7%B3%BB%E7%BB%9F/1.htm">调度系统</a> <div>目录一、Hera启动过程二、Master节点启动流程三、Worker节点启动流程四、心跳机制实现五、任务调度执行流程六、架构特点总结在笔者的职业生涯中,Hera调度系统是使用过的所有开源调度系统中最符合用户操作习惯、最贴近业务实际需求的一款产品——没有之一。若论产品成熟度与用户体验,或许只有部分大厂自研的调度平台才能与之比肩。与DolphinScheduler等主流开源调度系统相比,Hera的设计</div> </li> <li><a href="/article/1943115243727155200.htm" title="Python通关秘籍之基础教程(一)" target="_blank">Python通关秘籍之基础教程(一)</a> <span class="text-muted">Smile丶Life丶</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E5%85%B3%E6%8C%87%E5%8D%97%EF%BC%9A%E4%BB%8E%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%88%B0%E9%AB%98%E6%89%8B%E4%B9%8B%E8%B7%AF/1.htm">通关指南:从零基础到高手之路</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>引言在编程的世界里,Python就像一位温和而强大的导师,它以简洁优雅的语法和强大的功能吸引着无数初学者和专业人士。无论你是想开发网站、分析数据、构建人工智能,还是仅仅想学习编程思维,Python都是你的理想选择。Python的魅力在于它的易读性和广泛的应用场景。它的代码就像英语句子一样自然,即使是完全没有编程经验的人也能快速上手。同时,Python拥有庞大的生态系统,从Web开发(Django、</div> </li> <li><a href="/article/1943112471732613120.htm" title="Python协程从入门到精通:9个案例解析yield、gevent与asyncio实战" target="_blank">Python协程从入门到精通:9个案例解析yield、gevent与asyncio实战</a> <span class="text-muted">python_chai</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%8D%8F%E7%A8%8B/1.htm">协程</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/yield%E7%94%9F%E6%88%90%E5%99%A8/1.htm">yield生成器</a><a class="tag" taget="_blank" href="/search/gerrnlet/1.htm">gerrnlet</a><a class="tag" taget="_blank" href="/search/gevent/1.htm">gevent</a> <div>引言痛点分析:传统多线程在高并发场景下的性能瓶颈。协程优势:轻量级、高并发、低资源消耗。本文目标:通过9个代码案例,系统讲解协程的核心技术和应用场景。目录引言1.协程基础:理解yield生成器1.1yield的暂停与恢复机制1.2生产者-消费者模型实战1.3双向通信:send()方法详解2.手动协程控制:greenlet进阶2.1greenlet的显式切换原理2.2多任务协作案例3.自动化协程:g</div> </li> <li><a href="/article/1943107557711212544.htm" title="PHP安全编程实践系列(三):安全会话管理与防护策略" target="_blank">PHP安全编程实践系列(三):安全会话管理与防护策略</a> <span class="text-muted">软考和人工智能学堂</span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/php%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%BB%8F%E9%AA%8C/1.htm">php程序设计经验</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言会话管理是Web应用安全的核心环节,不安全的会话实现可能导致用户账户被劫持、敏感数据泄露等严重后果。本文将深入探讨PHP中的会话安全机制,分析常见会话攻击手段,并提供全面的防护策略和实践方案。一、会话安全基础1.1PHP会话机制工作原理理论:PHP会话是通过会话ID(SessionID)在服务器和客户端之间维持状态的一种机制。关键流程包括:会话初始化:session_start()调用会话ID</div> </li> <li><a href="/article/1943107557023346688.htm" title="Python爬虫在社交平台数据挖掘中的应用:深入探索用户互动" target="_blank">Python爬虫在社交平台数据挖掘中的应用:深入探索用户互动</a> <span class="text-muted">程序员威哥</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a> <div>引言社交媒体已经成为全球用户互动的主要平台,每天都有大量的信息生成,用户之间的互动行为如点赞、评论、分享、转发等构成了宝贵的数据资源。如何利用这些互动数据为商业决策、用户行为分析以及产品优化提供支持,已经成为数据科学与大数据分析领域的一个重要课题。Python作为一款强大的编程语言,凭借其丰富的爬虫库和数据分析工具,已经成为挖掘社交平台数据的重要工具。在本文中,我们将通过Python爬虫技术,深入</div> </li> <li><a href="/article/120.htm" title="web前段跨域nginx代理配置" target="_blank">web前段跨域nginx代理配置</a> <span class="text-muted">刘正强</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/cms/1.htm">cms</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>nginx代理配置可参考server部分 server {         listen       80;         server_name  localhost; </div> </li> <li><a href="/article/247.htm" title="spring学习笔记" target="_blank">spring学习笔记</a> <span class="text-muted">caoyong</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>一、概述     a>、核心技术 : IOC与AOP b>、开发为什么需要面向接口而不是实现     接口降低一个组件与整个系统的藕合程度,当该组件不满足系统需求时,可以很容易的将该组件从系统中替换掉,而不会对整个系统产生大的影响 c>、面向接口编口编程的难点在于如何对接口进行初始化,(使用工厂设计模式) </div> </li> <li><a href="/article/374.htm" title="Eclipse打开workspace提示工作空间不可用" target="_blank">Eclipse打开workspace提示工作空间不可用</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a> <div>做项目的时候,难免会用到整个团队的代码,或者上一任同事创建的workspace, 1.电脑切换账号后,Eclipse打开时,会提示Eclipse对应的目录锁定,无法访问,根据提示,找到对应目录,G:\eclipse\configuration\org.eclipse.osgi\.manager,其中文件.fileTableLock提示被锁定。 解决办法,删掉.fileTableLock文件,重</div> </li> <li><a href="/article/501.htm" title="Javascript 面向对面写法的必要性?" target="_blank">Javascript 面向对面写法的必要性?</a> <span class="text-muted">一炮送你回车库</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>现在Javascript面向对象的方式来写页面很流行,什么纯javascript的mvc框架都出来了:ember 这是javascript层的mvc框架哦,不是j2ee的mvc框架   我想说的是,javascript本来就不是一门面向对象的语言,用它写出来的面向对象的程序,本身就有些别扭,很多人提到js的面向对象首先提的是:复用性。那么我请问你写的js里有多少是可以复用的,用fu</div> </li> <li><a href="/article/628.htm" title="js array对象的迭代方法" target="_blank">js array对象的迭代方法</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/array/1.htm">array</a> <div>1.forEach 该方法接受一个函数作为参数, 对数组中的每个元素 使用该函数  return 语句失效 function square(num) { print(num, num * num); } var nums = [1,2,3,4,5,6,7,8,9,10]; nums.forEach(square); 2.every 该方法接受一个返回值为布尔类型</div> </li> <li><a href="/article/755.htm" title="对Hibernate缓存机制的理解" target="_blank">对Hibernate缓存机制的理解</a> <span class="text-muted">归来朝歌</span> <a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98/1.htm">一级缓存</a><a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1%E6%8C%81%E4%B9%85%E5%8C%96/1.htm">对象持久化</a> <div>在hibernate中session一级缓存机制中,有这么一种情况: 问题描述:我需要new一个对象,对它的几个字段赋值,但是有一些属性并没有进行赋值,然后调用 session.save()方法,在提交事务后,会出现这样的情况: 1:在数据库中有默认属性的字段的值为空 2:既然是持久化对象,为什么在最后对象拿不到默认属性的值? 通过调试后解决方案如下: 对于问题一,如你在数据库里设置了</div> </li> <li><a href="/article/882.htm" title="WebService调用错误合集" target="_blank">WebService调用错误合集</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a> <div> Java.Lang.NoClassDefFoundError: Org/Apache/Commons/Discovery/Tools/DiscoverSingleton 调用接口出错, 一个简单的WebService import org.apache.axis.client.Call;import org.apache.axis.client.Service; 首先必不可</div> </li> <li><a href="/article/1009.htm" title="JSP和Servlet的中文乱码处理" target="_blank">JSP和Servlet的中文乱码处理</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Java+Web/1.htm">Java Web</a> <div>JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下。应该是可以解决日常的乱码问题了。现在作以下总结希望对需要的人有所帮助。我也是刚学,所以有不足之处希望谅解。 一、表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式。所以</div> </li> <li><a href="/article/1136.htm" title="面试经典六问" target="_blank">面试经典六问</a> <span class="text-muted">atongyeye</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>题记:因为我不善沟通,所以在面试中经常碰壁,看了网上太多面试宝典,基本上不太靠谱。只好自己总结,并试着根据最近工作情况完成个人答案。以备不时之需。 以下是人事了解应聘者情况的最典型的六个问题: 1 简单自我介绍 关于这个问题,主要为了弄清两件事,一是了解应聘者的背景,二是应聘者将这些背景信息组织成合适语言的能力。 我的回答:(针对技术面试回答,如果是人事面试,可以就掌</div> </li> <li><a href="/article/1263.htm" title="contentResolver.query()参数详解" target="_blank">contentResolver.query()参数详解</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/query%28%29%E8%AF%A6%E8%A7%A3/1.htm">query()详解</a> <div>收藏csdn的博客,介绍的比较详细,新手值得一看 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME。 [java]  view plain copy   public void fetchAllContacts() {      </div> </li> <li><a href="/article/1390.htm" title="ora-00054:resource busy and acquire with nowait specified解决方法" target="_blank">ora-00054:resource busy and acquire with nowait specified解决方法</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kill/1.htm">kill</a><a class="tag" taget="_blank" href="/search/nowait/1.htm">nowait</a> <div>        当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行(或者事务已经被锁),所有导致执行不成功。 1.下面的语句</div> </li> <li><a href="/article/1517.htm" title="web 开发乱码" target="_blank">web 开发乱码</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>以下前端都是 utf-8 字符集编码 一、后台接收 1.1、 get 请求乱码 get 请求中,请求参数在请求头中; 乱码解决方法: a、通过在web 服务器中配置编码格式:tomcat 中,在 Connector 中添加URIEncoding="UTF-8"; 1.2、post 请求乱码 post 请求中,请求参数分两部份, 1.2.1、url?参数,</div> </li> <li><a href="/article/1644.htm" title="【Spark十六】: Spark SQL第二部分数据源和注册表的几种方式" target="_blank">【Spark十六】: Spark SQL第二部分数据源和注册表的几种方式</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a> <div>Spark SQL数据源和表的Schema case class apply schema parquet json JSON数据源 准备源数据 {"name":"Jack", "age": 12, "addr":{"city":"beijing&</div> </li> <li><a href="/article/1771.htm" title="JVM学习之:调优总结 -Xms -Xmx -Xmn -Xss" target="_blank">JVM学习之:调优总结 -Xms -Xmx -Xmn -Xss</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/-Xss/1.htm">-Xss</a><a class="tag" taget="_blank" href="/search/-Xmn/1.htm">-Xmn</a><a class="tag" taget="_blank" href="/search/-Xms/1.htm">-Xms</a><a class="tag" taget="_blank" href="/search/-Xmx/1.htm">-Xmx</a> <div>  堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置: java -Xmx355</div> </li> <li><a href="/article/1898.htm" title="jqGrid 各种参数 详解(转帖)" target="_blank">jqGrid 各种参数 详解(转帖)</a> <span class="text-muted">BreakingBad</span> <a class="tag" taget="_blank" href="/search/jqGrid/1.htm">jqGrid</a> <div>  jqGrid 各种参数 详解 分类:  源代码分享  个人随笔请勿参考  解决开发问题 2012-05-09 20:29   84282人阅读   评论(22)   收藏   举报 jquery 服务器 parameters function ajax string   </div> </li> <li><a href="/article/2025.htm" title="读《研磨设计模式》-代码笔记-代理模式-Proxy" target="_blank">读《研磨设计模式》-代码笔记-代理模式-Proxy</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * 下面</div> </li> <li><a href="/article/2152.htm" title="应用升级iOS8中遇到的一些问题" target="_blank">应用升级iOS8中遇到的一些问题</a> <span class="text-muted">chenhbc</span> <a class="tag" taget="_blank" href="/search/ios8/1.htm">ios8</a><a class="tag" taget="_blank" href="/search/%E5%8D%87%E7%BA%A7iOS8/1.htm">升级iOS8</a> <div>1、很奇怪的问题,登录界面,有一个判断,如果不存在某个值,则跳转到设置界面,ios8之前的系统都可以正常跳转,iOS8中代码已经执行到下一个界面了,但界面并没有跳转过去,而且这个值如果设置过的话,也是可以正常跳转过去的,这个问题纠结了两天多,之前的判断我是在 -(void)viewWillAppear:(BOOL)animated  中写的,最终的解决办法是把判断写在 -(void</div> </li> <li><a href="/article/2279.htm" title="工作流与自组织的关系?" target="_blank">工作流与自组织的关系?</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>  目前的工作流系统中的节点及其相互之间的连接是事先根据管理的实际需要而绘制好的,这种固定的模式在实际的运用中会受到很多限制,特别是节点之间的依存关系是固定的,节点的处理不考虑到流程整体的运行情况,细节和整体间的关系是脱节的,那么我们提出一个新的观点,一个流程是否可以通过节点的自组织运动来自动生成呢?这种流程有什么实际意义呢?   这里有篇论文,摘要是:“针对网格中的服务</div> </li> <li><a href="/article/2406.htm" title="Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX" target="_blank">Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>insert提示IGNORE_ROW_ON_DUPKEY_INDEX 转自:http://space.itpub.net/18922393/viewspace-752123 在 insert into tablea ...select * from tableb中,如果存在唯一约束,会导致整个insert操作失败。使用IGNORE_ROW_ON_DUPKEY_INDEX提示,会忽略唯一</div> </li> <li><a href="/article/2533.htm" title="二叉树:堆" target="_blank">二叉树:堆</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%A0%91/1.htm">二叉树</a> <div>    这里说的堆其实是一个完全二叉树,每个节点都不小于自己的子节点,不要跟jvm的堆搞混了.由于是完全二叉树,可以用数组来构建.用数组构建树的规则很简单:     一个节点的父节点下标为: (当前下标 - 1)/2     一个节点的左节点下标为: 当前下标 * 2 + 1   &</div> </li> <li><a href="/article/2660.htm" title="C语言学习八结构体" target="_blank">C语言学习八结构体</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>为什么需要结构体,看代码 # include <stdio.h> struct Student //定义一个学生类型,里面有age, score, sex, 然后可以定义这个类型的变量 { int age; float score; char sex; } int main(void) { struct Student st = {80, 66.6,</div> </li> <li><a href="/article/2787.htm" title="centos安装golang" target="_blank">centos安装golang</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>#在国内镜像下载二进制包 wget -c  http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz   #把golang的bin目录加入全局环境变量 cat >>/etc/profile<</div> </li> <li><a href="/article/2914.htm" title="10.性能优化-监控-MySQL慢查询" target="_blank">10.性能优化-监控-MySQL慢查询</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/MySQL%E6%85%A2%E6%9F%A5%E8%AF%A2/1.htm">MySQL慢查询</a> <div>1.记录慢查询配置 show variables where variable_name like 'slow%' ; --查看默认日志路径 查询结果:--不用的机器可能不同 slow_query_log_file=/var/lib/mysql/centos-slow.log 修改mysqld配置文件:/usr /my.cnf[一般在/etc/my.cnf,本机在/user/my.cn</div> </li> <li><a href="/article/3041.htm" title="Java父类取得子类类名" target="_blank">Java父类取得子类类名</a> <span class="text-muted">happyqing</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/this/1.htm">this</a><a class="tag" taget="_blank" href="/search/%E7%88%B6%E7%B1%BB/1.htm">父类</a><a class="tag" taget="_blank" href="/search/%E5%AD%90%E7%B1%BB/1.htm">子类</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB%E5%90%8D/1.htm">类名</a> <div>  在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来的那个类的实例对象,所以在父类中你可以用this获取到子类的信息!   package com.urthinker.module.test; import org.junit.Test; abstract class BaseDao<T> { public void </div> </li> <li><a href="/article/3168.htm" title="Spring3.2新注解@ControllerAdvice" target="_blank">Spring3.2新注解@ControllerAdvice</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/%40Controller/1.htm">@Controller</a> <div>@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:   @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Co</div> </li> <li><a href="/article/3295.htm" title="Java spring mvc多数据源配置" target="_blank">Java spring mvc多数据源配置</a> <span class="text-muted">liuxihope</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>转自:http://www.itpub.net/thread-1906608-1-1.html 1、首先配置两个数据库 <bean id="dataSourceA" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close&quo</div> </li> <li><a href="/article/3422.htm" title="第12章 Ajax(下)" target="_blank">第12章 Ajax(下)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3549.htm" title="BW / Universe Mappings" target="_blank">BW / Universe Mappings</a> <span class="text-muted">blueoxygen</span> <a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a> <div>  BW Element OLAP Universe Element Cube  Dimension Class Charateristic A class with dimension and detail objects (Detail objects for key and desription) Hi</div> </li> <li><a href="/article/3676.htm" title="Java开发熟手该当心的11个错误" target="_blank">Java开发熟手该当心的11个错误</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>#1、不在属性文件或XML文件中外化配置属性。比如,没有把批处理使用的线程数设置成可在属性文件中配置。你的批处理程序无论在DEV环境中,还是UAT(用户验收 测试)环境中,都可以顺畅无阻地运行,但是一旦部署在PROD 上,把它作为多线程程序处理更大的数据集时,就会抛出IOException,原因可能是JDBC驱动版本不同,也可能是#2中讨论的问题。如果线程数目 可以在属性文件中配置,那么使它成为</div> </li> <li><a href="/article/3803.htm" title="推行国产操作系统的优劣" target="_blank">推行国产操作系统的优劣</a> <span class="text-muted">yananay</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%9B%BD%E4%BA%A7%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">国产操作系统</a> <div>最近刮起了一股风,就是去“国外货”。从应用程序开始,到基础的系统,数据库,现在已经刮到操作系统了。原因就是“棱镜计划”,使我们终于认识到了国外货的危害,开始重视起了信息安全。操作系统是计算机的灵魂。既然是灵魂,为了信息安全,那我们就自然要使用和推行国货。可是,一味地推行,是否就一定正确呢? 先说说信息安全。其实从很早以来大家就在讨论信息安全。很多年以前,就据传某世界级的网络设备制造商生产的交</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>