📄 6.html
字号:
javac -encoding MyEncoding MyJavaFile.java<p>
编译 MyJavaFile 时 -encoding 所指定的 MyEncoding. 通常中文的编码有大陆和新加坡使用的 GB2312 以及 台湾和香港使用的 Big5, 普通英文用的是ISO_8859_1. 这里只关注 GB2312. 如果在编译的命令行中指定了编码, 那么就使用指定的编码格式, 如果没有指定, 将使用系统缺省的编码格式, 在 windows的中文简体版下都是 GB2312, 而 Linux 下不同的终端可以有不同的编码, 可以直接设置环境变量 LC_ALL LANG 等指定相应的不同类型信息的编码, 比如数字,日期, 货币, 姓名等等. 可以用 locale 命令来看当前终端所有的编码. 在Java 程序中可以使用 System.getProperty("file.encoding"); (注 1) 来获取当前的编码格式. 好了, 当编译的时候, 源码中的中文字符串都会按照指定的或者缺省的编码格式映射为相应的 UNICODE , 而不是看做简单的 ASCII 字符.所以编码格式就是处理源码中的各种各样的字符, 与运行时无关, 所以如果你的源文件中没有直接需要使用中文的地方, 比如菜单, 按钮, 标签什么的, 就不需要指定编码了.<p>
二, 字体的选择:<br>
必须使用能够显示中文的字体, 好象有些废话. 但还是有必要说一说. AWT 可以在中文系统中直接显示中文, 但是在不是中文系统但是有中文字体的系统中不能, 需要修改一下 $JAVA_HOME/jre/lib/font.properties,加入中文字体, 至于怎么加入, 就不谈了. 而 Swing 不需要这样, 只要你的系统中有中文字体就可以使用这样的字体来显示中文. 怎么知道一种字体能不能显示中文呢? 看下面的程序片段: (注 2)<p>
Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFFonts();<br>
System.out.println("Chinese Fonts: \n");<br>
for (int i = 0; i < fonts.length; i ++)<br>
{<br>
if (fonts[i].canDisplayUpTo("\u4e00") > 0) // 注 3<br>
{<br>
System.out.println(fonts[i].getFontName());<br>
}<br>
}<p>
好了, 知道了系统中有没有中文字体, 然后选择一个就是了. 如果选择了不能显示中文的字体, 通常的情况是显示方框.<br>
好了, Swing 的中文显示介绍完了, 输入和编辑中文就和显示差不多, 选一个字体就可以了, 具体得看你而 Linux 的具体设置了, 这里就不多说了.<br>
从以上两点来看, 其实最重要的还是字体的选择. 我的网站上有 ScreenShot和测试程序, 欢迎来访问. http://SuperMMX.dhs.org<p>
<br>
注 1: 据 jdk1.2.2 的文档, 并没有这个属性, 很奇怪, 但是确实可用.<br>
注 2: jdk 1.2 以上自带的字体支持 Unicode, 但是不支持 Unicode 汉字. 所以打出来的结果包含了 jdk 自带的字体.<br>
注 3: UNICODE 中, UNICODE 汉字从 \u3400 到 \u9FFF 中间, \uF900 到 \uFAFF也有一些, 但是 GB2312 和 Big5 的汉字和字符都是在 \u4E00 到 \u9FFF中间.<p>
参考文献:<br>
jdk tools doc<br>
一篇没有作者名字, 也没有出处的英文文章.<p>
<p>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I157" ID="I157"></A><center><b><font size=+2>sendmaild</font></b></center><br>
最简提示:<p>
主要的问题是如何配置sendmail.cf.<br>
如果你用的是redhat,执行:<p>
cd /usr/lib/sendmail-cf/cf<br>
m4 redhat.mc > sendmail.cf<br>
cp sendmail.cf /etc/sendmail.cf<br>
sendmail -bd(或者reboot)<p>
上面的方法配置之后服务器发信没问题,而远端机器却不能发信,是因为缺省redhat.mc生成的sendmail.cf禁止了客户服务,<br>
这样:找到下面一行(sendmail.cf):<p>
R$* $#error $@ 5.7.1 $: "550 relay denied"<br>
改成<br>
R$- $@ ok<p>
就行了,不过当心有人用你的系统发垃圾邮件<p>
<p>
<br>
<center><A HREF="#Content">[目录]</A></center>
<hr><br><A NAME="I735" ID="I735"></A><center><b><font size=+2>sendmail扮演的角色</font></b></center><br>
1. sendmail扮演的角色<p>
sendmail程序扮演着多种不同的角色,最主要的角色就是传递电子邮件。它监听来自网络的电子邮件,传送电子邮件到另一台机器,通过本地传送,将本地信件传给本地程序。它能够在邮件中附加上文件,也能够使用管道将邮件发给其它程序。它能够维护一个邮件队列,有序地将邮件发送出去,还可以理解接收者的邮件别名,将其发送到真正的目标用户当中去。<p>
1.1在文件系统中的角色<p>
sendmail程序的角色(位置)在本地文件系统中,就象一个倒置的树,如图3-1。当sendmail运行时,首先读取/etc/sendmail.cf配置文件。在这个配置文件中,能够指出sendmail所需要的其它文件与目录的位置。<p>
<br>
图3-1 sendmail.cf的层次结构<p>
安全起见,在配置文件/etc/sendmail.cf中指定的文件、目录名一般都使用绝对路径,例如:使用/var/spool/mqueue,而不使用mqueue。在我们讲解这些文件之前,首先运行如下命令以收集一个文件列表:<p>
% grep = / /etc/sendmail.cf<p>
<br>
注:如果你使用的是V8.7以上版本的sendmail,则你需要查找的应该改为”/[^0-9].*/”.<p>
这个命令将会出现类似如下的结果:<p>
<br>
O AliasFile=/etc/aliases<br>
#O ErrorHeader=/etc/sendmail.oE<br>
O HelpFile=/usr/lib/sendmail.hf<br>
O QueueDirectory=/var/spool/mqueue<br>
O StatusFile=/etc/sendmail.st<br>
#O UserDatabaseSpec=/etc/userdb<br>
#O ServiceSwitchFile=/etc/service.switch<br>
#O HostsFile=/etc/hosts<br>
#O SafeFileEnvironment=/arch<br>
Mlocal,P=/bin/mail, F=lsDFMAw5:/|@rmn, S=10/30, R=20/40,<br>
Mprog, P=/bin/sh, F=lsDFMoeu, S=10/30, R=20/40, D=$z:/,<p>
<p>
请注意,有些行是以字母O开始,有些行是以字母M开始,有些行是以#开始的。以字母O开始的行是配置选项。字母O后面紧跟着选项的名字。选项的值指出了sendmail使用的文件。例如,AliasFile定义了本地的aliases数据库文件。以M开始的行则定义了分发代理。以#开始的行就是注释。<p>
首先我们考察以O开始的选项行。然后再分析以M开始的分发代理选项。<p>
1.1.1 aliases文件<p>
aliasing就是将接收者的名字转换另一个名字。一种情况下是将一些通用名字(如root、webmaster)转换成真正的用户名。另一种情况下是将一个名字转换成多个名字的列表(如使用邮件列表)。<p>
Aliases文件在sendmail.cf文件中的AliasFile选项中指定,例如:<p>
O AliasFile=/etc/aliases<p>
<br>
以下是一个aliases文件的简要实例:<p>
# Mandatory aliases.<br>
postmaster: root<br>
MAILER-DAEMON: postmaster<br>
# The five forms of aliases<br>
John_Adams: adamj<br>
xpres: ford,carter,bush<br>
oldlist: :include: /usr/local/oldguys<br>
nobody: /dev/null<br>
ftphelp: |/usr/local/bin/sendhelp<p>
你的aliases文件可能更长、更复杂的,不过,以上这个示例也显示了aliases所有可能的构成。<p>
以#开始的行,是注释行。空行被忽略不计。第一行就是一个注释行,它指出了2、3两行是每一个aliases文件被必须强制拥有的。所有的别名格式都是一样的,一个名字(别名)和一个要改为成的名字(原名)。别名在“:”号的左边,原名在“:”号的右边。名字是不区分大小写。例如:POSTMASTER,Postmaster以及postmaster都是相同的。<p>
如果信封上列出的接收者名字是本地用户的话,sendmail程序就会查找aliases文件。如果sendmail发现接收者名字如果与aliases文件中的“:”号左边的名字相匹配,就将接收者名字替换为“:”号右边的名字。例如:发给本地的postmaster的信,会被转变成为发给root的信。<p>
在一个名字被替换后,会使用这个被替换后的名字继续查找,直到没有匹配的名字为止。如MAILER-DAEMON首先被转变为postmatser,然后postmaster又被改被为root。由于没有一个以root开始的别名项,所以转换过程到此结束,信件最后被传送到root的信箱中去。<p>
任何一个aliases文件必须有一个将postmaster转变成实际用户的别名项。因为当邮件出现问题时,总是会生成一个错误报告的信,发给postmaster。所以最好将这样的信发给邮件的系统管理员。<p>
当电子邮件被退回时,将会发给MAILER-DAEMON。所以这个别名是必须的。没有这个设置的话,退回的信将会在发件人与收件人之间不断来回传送。<p>
Aliases文件中有五种类型:<p>
John_Adams: adamj<br>
xpres: ford,carter,reagan,bush<br>
oldlist: :include: /usr/local/oldguys<br>
nobody: /dev/null<br>
ftphelp: |/usr/local/bin/sendhelp<p>
首先我们看一下第一行,这一行的格式与我们前面的例子相似,这一句让sendmail程序将发给John_Adams的信都给真实用户adamj。<p>
xpres那一行则象大家演示了如何将一个名字扩展到一组名字,发给xpres的信件将扩展为ford、carter、reagan、bush,并使用这些名字进行aliases处理,直到无匹配为止。然后将信件的副本分发给每一个。<p>
而oldlist这行,则象大家演示了如何从一个文件中读取一组名字,本例中就是让sendmail将发给oldlist的信息扩展为在/usr/local/oldguys文件里的用户列表。请记住它的格式,在文件绝对路径名前需加上“:include:”。<p>
nobody这一行,象大家演示了如何用文件名代替别名。发到这个邮件中的内容将添加到所指定的文件后面去。这里指定的是/dev/null。这样就是指发到nobody的信件将会被简单地丢弃。<p>
最后一行,ftphelp那一行象大家演示了如何用程序名代替别名。字符“|”使sendmail将这个邮件信息通过管道发给所指定的程序。<p>
aliases文件可能变得非常复杂。它能够用于解决许多特殊的问题。aliases文件的更多的内容将在第24章:别名中详述。<p>
1.1.2 邮件队列目录<p>
在很多情况下,都可能使一个电子邮件临时无法发送,例如:远程主机已经down了,或临时出现了磁盘错误。为了确保邮件最终能够发送成功,sendmail将会把它们存到邮件队列目录中,直到发送成功为止。<p>
配置文件中的选项QueueDirectory用于指定sendmail的邮件队列目录:<p>
O QueueDirectory=/var/spool/mqueue<p>
<br>
这里指出的目录名必须是全路径名。<p>
如果你用足够的权限,看一看队列目录。如果没有邮件等待发送的话,它们可能是空的。如果它们不是空的,那么可能包括形如以下的文件:<p>
dfQAA07038 dfMAA08000 qfQAA07038 qfMAA08000<p>
<br>
当一个邮件信息进入了邮件队列,将分成两个部分,每一个部分都保存在一个文件中。头信息存在一个文件名是以qf开头的文件中。邮件内容部分则存在一个文件名是以df开头的文件中。<p>
上例中,有两个邮件在邮件队列中。其中一个被标识为QAA07038,而另一个被标识为MAA08000。<p>
队列文件的格式与处理方法,我们将在第23章:邮件队列中详细说明。<p>
1.2本地分发的角色<p>
sendmail的另外一个角色则是分发电子邮件信息给本地用户。一个本地用户在本地系统上有一个邮箱。分发本地邮件,就是将其附加到这个用户的邮箱中。<p>
通常,sendmail不是直接将邮件信息直接放到文件中去。在上一节中,我们看到,只有指定sendmail程序将邮件附加到一个文件中时,才这样做的。但这是一个例外,不是规则,sendmail调用其他程序执行分发。被调用的程序叫做分发代理。<p>
在你的sendmail.cf文件中,有两行用来定义本地分发代理,其中一个用于在本地系统中分发邮件:<p>
Mlocal,P=/bin/mail, F=lsDFMAw5:/|@rm, s=10, R=20/40,<br>
Mprog,P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,<p>
程序/bin/mail用来将邮件附加到用户的邮箱中。程序/bin/sh用来运行其它程序来处理分发。<p>
1.2.1 分发到邮箱<p>
配置文件中,以Mlocal开始的行定义了邮件如何附加到用户的邮箱文件中去。通常是使用/bin/mail程序,也可以使用deliver或mail.local程序。<p>
在UNIX系统中,用户的邮箱是一个单独文件,其中个邮件信息。通常UNIX系统约定(但不是唯一的可能)每一个在邮箱文件中邮件信息以一个五字节长的“From ”(4个字母、一个空格)开始,并以一个空行结束。<p>
Sendmail程序并不知道也不关心用户的邮箱文件是什么样的。而只关心将邮件添加到邮箱文件中的程序名称。例如:/bin/mail。以M开头的配置行定义了分发代理,详细的介绍可以参看第6章:Mail中枢和分发代理,以及第30章:分发代理。<p>
1.2.2 借助程序分发<p>
在1.1小节中的aliases文件示例中的ftphelp行,是以字符“|”开始的程序名作为Mail的目的地:<p>
ftphelp: |/usr/local/bin/sendhelp<p>
<br>
在此情况下,发送到ftphelp中的mail,经过别名转换到|/usr/local/bin/sendhelp中。以字符“|”开始的目的地地址告诉sendmail启动这个程序,而非添加到一个文件中去。这主要是实现使用一个邮件程序对接收的邮件作一些有用的处理。<p>
Sendmail程序不直接运行邮件的分发程序。而是运行一个shell,并告诉shell运行这个程序。这个shell的名字在配置文件中以Mprog开始的行中定义:<p>
Mprog,P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,<p>
<br>
在这个例子是,指定的shell是/bin/sh。也可以使用/bin/ksh或smrsb。<p>
1.3网络传输角色<p>
sendmail还有一个角色就是负责将邮件传送到另一台机器。当sendmail确定接收者不在本地系统中时,邮件将传送出去。下列是典型的配置文件中定义负责将邮件传送到其它机器的分发代理:<p>
<br>
MsmtpP=[IPC], F=mDFMuX, S=11/31, R=21, E=<br>
, L=990,<br>
MuucpP=/usr/bin/uux, F=DFMhuUd, S=12, R=22/42, M=10000000,<p>
<p>
而在实际的配置文件中可能会有一些不同。上面例子中,smtp可以写为ether或ddn或其它的一些东西。而uucp可以写为suucp或uucp-dom。一个重要的知识点就是有一些分发代理处理本地分发,另外一些处理跨越网络的分发。<p>
1.1.1 TCP/IP<p>
sendmail程序内在拥有在同一种网络中传输邮件的能力,那就是使用TCP/IP;下列的行就是用来指示sendmail去处理:<p>
<br>
MsmtpP=[IPC], F=mDFMux, S=11/31, R=21, E=<br>
, L=990<p>
其中[IPC]可以写作[TCP],它们是完全等价的。<p>
当sendmail程序在TCP/IP网络中传输mail时,首先发送“信封”上的发信人主机名到另一个站点。如果这个站点认可这个发信人的主机名是合法的,本地的sendmail程序将发送“信封”上的收信人列表。这个站点针对每一个收件人确定接受或拒绝。如果一些收件人被接受,则本地的sendmail程序发送出邮件信息(信头和信体)。<p>
1.1.2 UUCP<p>
在配置文件中设置sendmail如何通过UUCP传输邮件的行如下所示:<p>
MuucpP=/usr/bin/uux, F=DFMhuUd, S=12, R=22/42, M=10000000,<p>
这行告诉sendmail程序使用/bin/uux来通过UUCP网络传输邮件。<p>
1.1.3 其它协议<p>
sendmail程序还可通过其它网络协议传输mail。你可以从我们前面做过grep操作的输出结果中发现它们,它们看上去象:<p>
Mfax, P=/usr/local/lib/fax/mailfax, F=DFMhu, S=14, R=24, M=100000,<br>
Mmail11, P=/usr/etc/maill11, F=nsFx, S=15, R=25, A=mail11 $g $x $h $u<br>
Mmac,P=/usr/bin/macmail, F=CDFMmpsu, R=16, S=16, A=macmail –t $u<p>
Mfax行定义了使用sendmail发送FAX的途径。FAX通过电话线传输文件的图形影象。在这个配置中,程序/usr/lib/fax/mailfax,将一个邮件文件的图形影象FAX出去。<p>
Mmail11行定义了使用mail11程序在DEC网络上传输邮件,一般应用于DEC系统。<p>
Mmac行定义了在Macintosh电脑系统的AppleTalk网络上传输邮件。<p>
在所有的这些例子中,sendmail通过专用的服务程序在网络上发送电子邮件。记住,sendmail本身只能直接在基于TCP/IP的网络上工作。<p>
1.4 Daemon角色<p>
就象sendmail能够在基于TCP/IP的网络上传输电子邮件一样,它也能够接收来自于网络的电子邮件。为了实现这个,就必须运行在daemon(守候进程)模式。Daemon是一个运行在后台,不受终端约束的程序。<p>
作为一个daemon,sendmail通常在系统启动时就运行。当一个电子邮件发送到你的机器时,远程机器将与运行在你机器上的sendmail daemon“商谈”。<p>
想观察你的系统如何将sendmail运行在daemon模式下,你可执行以下任何一条命令:<p>
% grep sendmail /etc/rc* (BSD系统)<br>
% grep sendmail /etc/init.d/* (SysV系统)<br>
% grep sendmail /etc/*rc (HP-UX系统)<p>
一个典型的输出是:<p>
/etc/rc.local:if [-f /usr/lib/sendmail –a –f /etc/sendmail.cf]; then<br>
/etc/rc.local: /usr/lib/sendmail –bd –q1h; echo –n ‘ sendmail’<p>
上面的第二行是sendmail在系统启动时运行的命令。<p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -