Java , Installanywhere 在 Redhat 上的中文问题解决方法

在 sun jdk /jre 的多个版本中,对于 Redhat 上的中文支持一直是非常糟糕。对于默认安装(不修改任何配置文件)、Java 代码中使用默认字体(不使用 setFont )的情况下,中文汉字总是出不来。在 windows 和 solaris 上则比较少出现这种情况。

有一种说法是 Sun 和 Redhat 是某种竞争关系,对于 Sun 公司来说,只要 Java 在 Solaris 和 Windows 上能够跑,其他操作系统都是多余的;只要 Java 在Solaris 上运行比在 Windows 上运行更好, Windows 也是多余的。正是这种敌视的态度,使得 Java 在非 Solaris 的操作系统上使用时要么中文不能出来,要么极其难看。

不管这种说法是否属实,Sun 没有解决 Java 在 Redhat 上的中文问题,给很多 Java 程序员带来极大的不便。 Sun 自己的网站上也有很多人问到这个问题,但是很少有人提供较好的解决方法,让人感到遗憾。

前一阵子我在使用 Installanywhere 制作在 Redhat 上运行的安装程序时,中文安装界面老是方块块,我将 Installanywhere 网站上所有的 Java VM 逐个试了一遍还是不行,我将 Installanywhere 网站上的讨论组基本上全部看过来,还是找不到解决方法,令我简直怀疑自己的智商。因此下决心查查 Java 在 Redhat 上的中文问题。

我首先向 Installanywhere 的中国一个代理商问起这个问题,他支支吾吾,只是说 Installanywhere 一定支持 Redhat 上的中文安装程序制作。多次电话来往后,我大概听明白了, Sun 不太希望 Installanywhere 在 Redhat 上有较好的表现,所以 Installanywhere 他们不能在网站上公开解决方法,他推荐我们用 Solaris。我说我们用不起 Solaris,然后就没有实质的进展。

我在 google 、中文 yahoo 上搜索了好几个星期都没有结果,但是有了一些资料。后来我到 Redhat 公司网站上搜索,又找到了一些资料。然后自己试了几次,终于搞定。

标准 jre/jdk 中只带了 redhat 6 的 font.properties, 我在 redhat 7.3 和 redhat 8.0 上都不能用。我们需要建一个 font.properties.zh.Redhat 放在 redhat 的 jre/lib 目录下。打开 /usr/lib/X11/fonts/ttf-zh 或者 /usr/share/fonts/zh_CN/TrueType 下面的 font.dir, 将其中的一个中文字体名复制下来,比如 -misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1,按照 java 的字体规则改为 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1,将 font.properties.zh 中的内容复制到 font.properties.zh.Redhat 中。

我选用字体 -misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1 是因为在 redhat 7.3 和 redhat 8.0 上都能用。

因为 jre/jdk 找不到 Redhat 的 true type 字体,在文件 font.properties.zh.Redhat 最后加入

appendedfontpath=/usr/lib/X11/fonts/ttf-zh
appendedfontpath=/usr/share/fonts/zh_CN/TrueType

将字体名全部替换成 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1,替换后的 font.properties.zh.Redhat 如下:

# @(#)font.properties.zh.Redhat.linux 1.4 02/06/10
#
# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
#

# Component Font Mappings
#
serif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

serif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

sansserif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

monospaced.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1


dialog.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialog.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

dialoginput.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
# Missing Glyph Character
#
default.char=274f

# Component Font Character Encodings
#
fontcharset.serif.0=sun.io.CharToByteISO8859_1
fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK

fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK

fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK

fontcharset.dialog.0=sun.io.CharToByteISO8859_1
fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK

fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK

# Exclusion Ranges
#

# XFontSet Information
#
fontset.serif.plain=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.italic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bold=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.serif.bolditalic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.plain=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.italic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bold=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.sansserif.bolditalic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.plain=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.italic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bold=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.monospaced.bolditalic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.italic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bold=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.bolditalic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialog.plain=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.italic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bold=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.bolditalic=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

fontset.dialoginput.plain=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

#fontset.default=/
#-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso10646-1,/
#-tlc-song-medium-r-normal--*-%d-*-*-c-*-gbk-0

fontset.default=/
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

appendedfontpath=/usr/lib/X11/fonts/ttf-zh
appendedfontpath=/usr/share/fonts/zh_CN/TrueType

使用 Installanywhere 我们编译安装程序选择 “其它 java 平台” 编译成一个 java 的 setup.jar 文件,在 Redhat 上面写一个批处理/脚本文件, set classpath , 包含 setup.jar, 批处理/脚本文件中使用 java install 启动安装程序。

这个方法在 redhat 7.3/ 8.0 下面测试通过。

对于 Redhat 上面的繁体中文依法炮制即可,建立 font.properties.zh_TW.Redhat 文件,将其中的字体名改为一个繁体中文字体名,在文件末尾加上合适的 appendedfontpath ,当然最后不要忘了在 Redhat 7.3 和 8.0 下面都测试一遍。

Linux 的不同版本配置方法不一样。主要是因为 Linus Torvalds 等有说话分量的人只专注在 Linux 内核开发上。如果他们对于其他方面略做规划,Linux 的不同版本差别不至于像现在这么大。在 Java + Linux 的使用过程中,我们深深地体会到了 “Write once, debug everywhere” 的苦处。

Installanywhere打包javaweb项目 一 准备阶段 由于我们打包的是javaweb项目,实现的目标是在一台没有javaweb项目运行环境下,可以通过一键安装后执行我们的项目客户机上,那么,我们需要准备如下文件 1、jdk -- 可以直接将你本机下安装好的jdk中拷贝,如 2、Tomcat -- 由于客户可能是不懂软件的,那么我们就需要下载一个免安装解压版的Tomcat,直接去官网下载 3、Mysql -- 同理,下载免安装版的mysql数据库 二 预处理阶段 1、对Tomcat进行部分优化,具体根据情况而定,我这里做了适当优化 2、将要运行的项目打成war包 放入Tomcat下的webapps下,尽量保证你的项目开发中依赖的Tomcat和该Tomcat版本一直吧 3、往mysql目录下添加文件夹和文件,如: data : 存放数据库数据的,在后面的脚本中可能要用到,这里提前创建,避免脚本出 错 sql : 这里用于存放你从本地库中导出的数据库脚本.sql文件,具体也不一定会用到 ,主要看后面的脚本如何编写 my.ini: 这是windows下的配置文件,配置了mysql的信息,解压版中是没有该文件的 手动创建一个,内容可以为空,也可以不为空,放入些基本的配置,我这里是直接为空的 为了后面installanywhere动态插入配置方便 4、将jdk, tomcat, mysql全部放入一个文件夹下如: Install.bat : 该文件用于注册和启动Tomcat,mysql的服务 set Path=%SystemRoot%\system32 set JAVA_HOME=%1%\jdk set CATALINA_HOME=%1%\tomcat set mysql_home=%1%\mysql net stop mysql5 call %1%\mysql\bin\mysqld --remove mysql5 call %1%\mysql\bin\mysqld --install mysql5 sc config mysql5 start= auto net start mysql5 call %mysql_home%\bin\mysqladmin -h localhost -u root password 123 call %mysql_home%\bin\mysql -hlocalhost -uroot -p123 <%mysql_home%\sql\one.sql net stop mytomcat call %1%\tomcat\bin\service remove mytomcat call %1%\tomcat\bin\service install mytomcat sc config mytomcat start= auto net start mytomcat uninstall.bat : 该文件用于停止并注销删除服务 set Path=%SystemRoot%\system32 set JAVA_HOME=%1%\jdk set CATALINA_HOME=%1%\tomcat net stop mytomcat net stop mysql5 call %1%\tomcat\bin\service remove mytomcat call %1%\mysql\bin\mysqld --remove mysql5 start.bat : 用于手动启动服务 set Path=%SystemRoot%\system32 net start mytomcat stop.bat : 用于手动关闭服务 set Path=%SystemRoot%\system32 net stop mytomcat one : 这个是用于制作应用程序打开的快捷方式 是一个.url文件 -- one.url 1.ico : 图片文件,用于快捷方式和或安装文件的图标 三 installanywhere 制作 注:产品名称就是那个会在windows开始菜单栏显示的文件夹名字 添加四个环境变量:就是会添加到windows下的高级属性设置的那个环境变量那里 JAVA_HOME $USER_INSTALL_DIR$\jdk CATALINA_HOME $USER_INSTALL_DIR$\tomcat CATALINA_DIR $USER_INSTALL_DIR$\tomcat\bin PATH $USER_INSTALL_DIR$\jdk\bin;$USER_INSTALL_DIR$\mysql\bin;$USER_INSTALL_DIR$\tomcat\bin 接下来制作快捷方式和开始菜单栏中的选项 其中的程序快捷方式制作 [InternetShortcut] URL="http://localhost:8082/test" IconFile=$USER_INSTALL_DIR$$\1.ico HotKey=0 IconIndex=0 IDList= 开始菜单栏中的卸载菜单制作 动态修改配置文件 这里我们先将mysql的my.ini文件进行修改,因为这个文件中有两个属性的值是用户在选择安装目录的时候传进来的,所以要修改,但是,我的文件内容是空的,就直接插入配置文本 我的文本模板是: [client] port=3306 default-character-set=utf8 [mysqld] port=3306 character_set_server=utf8 #安装路径 basedir="$USER_INSTALL_DIR$\\mysql" #数据路径 datadir="$USER_INSTALL_DIR$\\mysql\\data" # 允许最大连接数 max_connections=200 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [WinMySQLAdmin] $USER_INSTALL_DIR$\bin\mysqld.exe 后面再来执行安装注册时的批处理命令 -- 其中Command Line: cmd /c $USER_INSTALL_DIR$\install.bat $USER_INSTALL_DIR$ cmd /c表示执行指定的命令并中断。 $USER_INSTALL_DIR$是传递给install.bat中%1%的参数。 并且,选中Options中的3个选项。 将该Execute Command移动到Panel: Install Complete前面。 配置安装安程序后自动打开页面 反安装:配置卸载批处理 -- 菜单Pre-Uninstall>,按钮Add Action>Execute Command>Add>。 Command Line:  cmd /c $USER_INSTALL_DIR$\uninstall.bat $USER_INSTALL_DIR$ 将该Execute Command移动到第一个。 选中Options中的3个选项。 放在倒数第二的原因是:表示要等到选择完需要卸载的项后再执行,避免用户点击取消,把服务给注销了
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值