文档章节

MenuItem 显示中文乱码问题解决方案

J
 Java编程思想
发布于 2013/10/17 09:27
字数 1502
阅读 470
收藏 0
MenuItem 显示中文乱码问题解决方案

今天在使用Java做系统托盘图标(TrayIcon),需要为其增加一个右键弹出菜单(PopupMenu),在使用菜单项(MenuItem)时,遇到了一个非常痛苦的事情:中文乱码~~~~。这个问题不经常碰到,但是一旦碰到就头疼了,网上一搜,方法一大堆,但很少有方法能解决自己的问题,毕竟情况不一样。

今天搞了一天,终于搞出了一套方案。

  

先说一下出问题的原因:

 

1. 本地系统区域语言字符集的问题,我们的系统可能默认的字符集为GB2312或GBK。

 

2. Java源文件编码字符的问题,如果使用eclipse可以查看一下java source文件的编码方式。

 

3. javac编译时的字符问题,这一个问题很容易被忽略,运行一下javac可以看到有一个encoding的参数可以设置----这一个很重要。

 

4. 要读取文件的编码和读取时的字符集设置问题,如果我们要用的字符串不是硬编码在java源码中,而是从资源文件中读取时,就要注意这个问题了。

 

 

要解决问题需要做到如下:

 

1. 本地系统的语言字符可以不用管,主要看后面三项。

 

2. Java源文件的编码,这一点很重要,最好使用utf8编码。

我们在编辑文件时默认使用的是本地系统的字符集(如GBK),所以对Java源文件要进行字符转换或提前做好设置,对于UE使用 文件--->转换--->...到UTF-8(Unicode 编辑),对于eclipse设置  Window-->Preferences-->General-->Content Types--> Java Source File。具体操作此处不详述。

 

3. javac编译时的参数设置,增加encoding参数,如:javac -encoding utf8 Test.java

对于这一点要特别注意,eclipse的编译器是没有使用该参数的,我也没找到该如何设置该参数(注意这里是编译参数javac, 不是运行参数java或jvm, 不是run config中配置的),所以遇到这个问题的情况下不能使用eclipse来编译了,至少在能配置javac之前是这样。

不能使用eclipse了怎么办呢,手工不是太可能,有几种方案:

1. 手工编译使用到MenuItem的类,目前只发现java.awt包会存在这个问题,swing包能很好的解决这种字符集变换的问题。

2. 使用其它编译方式,如ant、Maven,它们都能配置javac。我现在就使用maven,只需要为它的编译器加入encoding配置,如下:

 

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>utf8</encoding>
				</configuration>
			</plugin>
                       ....
 

4. 要读取的文件的字符编码和读取流编码,对一个资源文件,我们也要设置其编码为utf8(参照第2条,跟设置java源文件编码是一样的),同时在使用流读取时也要设置流的读取编码(这个网上说java字符流的默认的是jvm的编码,跟系统字符集一致)。

选说说我的场景吧,我要从一个文件中读取字符串做为MenuItem的Label值(打算做国际化,呵呵),所以就需要对这个资源文件做处理,读取流代码如下:

 

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(langFile), "utf8"));

  这里还要注意的是:在复制这个资源文件时,最好也设置一下编码,如用ant复制时:

 

<echo message="copy conf"/>
<copy file="D:\klaudisk-client\conf\settings.ini"
	tofile="D:\klaudisk-client\target\conf\settings.ini" overwrite="true" encoding="utf8"/>
 

 

好了,做到以上条件问题应该解决了。

 

在实际的过程中我们可以通过以下步骤一步一步来达到以上条件,每步都可以测试。

 

1. 查看源文件的编码

这一点很简单,对于eclipse查看一下java source file编码方式就行了,保险一点就是修改一下编码方式,会发现原来的java文件(含中文的)乱码了,再改回来,就好了。 编码方式请设置为utf8

 

2. 编译编码的测试

可以先写一个小例子,使用硬编码的方式加入中文,如MenuItem m = new MenuItem("中文"),你用eclipse运行后可以发现这个menu显示的是乱码(全是小方框)。然后你用命令行的方式编译一下:javac -encoding utf8 Test.java。然后命令行运行,如果发现显示正常了,则这及以前的测试通过了,如果还是乱码,则需要你再次确认第1步。

 

3. 在前2部都确定成功的情况下再考虑读取资源文件的测试,这个参照前面说的就行了。

 

 

--OK,问题应该能解决了,这种方式还可以应用到其它中文乱码的问题上。

 

 

补充说明的是:awt不是不支持中文,是编码转换不够智能。在swing中就解决了这些问题。

关于这个TrayIcon,我看oracle那边已经提交了一个bug,意思是说要编写一个对应的swing的JTrayIcon,从而使用JPopupMenu和JMenuItem。但这个bug不是因字符问题提交的。

对于MenuItem乱码的问题,还可以使用JPopupMenu和JMenuItem来替代,参照如下,但情况不理想(弹出时必须要选择一个菜单,否则不消失):

 

ImageIcon icon = new ImageIcon(UITest.class.getResource("16.gif"));
		TrayIcon tray = new TrayIcon(icon.getImage());
		tray.setImageAutoSize(true);
		SystemTray.getSystemTray().add(tray);
		tray.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if (e.isPopupTrigger()) {
					final JPopupMenu pop = new JPopupMenu();
					JMenuItem m1 = new JMenuItem("中文");
					pop.add(m1);
					pop.add(new JMenuItem("主题"));
					pop.setLocation(e.getX(), e.getY());
					pop.setInvoker(pop);
					pop.setVisible(true);
				}
			}
		});
 

另外,对于第4点,资源文件的问题,还可以使用Properties.load()方法来加载.properties文件(该文件是被java bin下的navie2asc程序处理过的文件),这样就不用管第4点问题了,但问题很显然,不方便不直观。

 

---EOF---

 

本文转载自:http://www.myexception.cn/program/773479.html

共有 人打赏支持
下一篇: 中文转ascii
J
粉丝 25
博文 164
码字总数 9502
作品 0
广州
程序员
私信 提问
msysgit 中文乱码问题解决方法

msysgit安装好后处理中文是有问题的:ls中文目录/文件名乱码;提交中文的log,push到服务器上会乱码;git log查看服务器pull过来的log乱码。 1、ls命令列出的中文目录/文件名正确显示解决方法...

lieefu
2015/07/01
0
0
解决git在Windows下的乱码问题--解决代码从git 拉下来之后中文乱码的问题

Contents 1. 设置 Git 支持 utf-8 编码 2. 让 ls 命令可以显示中文名称 在Linux及托管网站上默认的编码都是utf-8,而Windows系统默认编码不是采用utf-8,所以Git 客户端在Windows下总是会有一...

Oscarfff
2016/08/22
9
0
linux终端 字符界面 显示乱码

方法一:配置SSH工具 SecureCRT中文版配置 [全局选项]→[默认会话]→[编辑默认设置]→[终端]→[外观]→[字体]→[新宋体 10pt CHINESE_GB2312]→[字符编码 UTF-8] putty配置 [window]→[Appe...

飞奔的骆驼
2017/08/16
0
0
servlet 中文乱码问题及解决方案

一、常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码; 3.getBytes() 是通过平台默...

三番水
2013/05/31
0
0
Windows 下 msysgit 中文配置

一、 概述 1. 参考文章 《git乱码解决方案汇总》 《另类方法解决Windows下git-bash中文输入的乱码问题》 2. 相关软件 Git for Windows msysgit:msysgit是Git 版本控制系统在 Windows 下的版...

千一
2013/08/09
0
3

没有更多内容

加载失败,请刷新页面

加载更多

深度学习为图片人物换装【python代码教程】

在观看本文之前,请答应我要善良。昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子。授人以鱼不如授人以渔,请这些同学好自为之~ 01效果演示...

阿里云官方博客
33分钟前
4
0
centos7安装RabbitMQ详细过程

由于RabbitMQ是基于Erlang语言开发,所以在安装RabbitMQ之前,需要先安装Erlang 1、环境: centos 7.1 内核版本3.10.0-229.el7.x86_64 Erlang 19.0.4版本 RabbitMQ 3.6.14版本 2、在线安装E...

秋至丶枫以落
今天
1
0
6个使用KeePassX保护密码的技巧

虽然安全是个深奥的主题,但是你可以遵循几个简单的日常习惯来减小攻击面。本文将解释确保密码信息安全的重要性,并给出如何充分利用KeePassX的建议。 日益互联的数字世界使安全成为一个重要...

Linux就该这么学
今天
1
0
UnsatisfiedLinkError sawindbg.dll

方法:搜索sawindbg.dll,然后将文件报错的目录下

洛水
今天
5
0
说说不知道的Golang中参数传递

本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为。在golang中...

腾讯云加社区
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部