Graphics.drawString()方法画中文字符出现乱码怎么解决?(急)

时间:2022-08-27 07:42:34
我在用Graphics.drawString()方法时,出现了乱码,这个该怎么解决啊?
代码:
g.drawString("中文",100,100);

11 个解决方案

#1


该回复于2009-08-18 21:51:44被版主删除

#2


没弄过,是不是字符编码的问题?在eclipse中设置如下:
windows->Preferences...打开"首选项"对话框,左侧导航树,导航到 general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。 

#3


可能是eclipse的编码设置问题,

#4


可能是字体的原因

#5


引用 1 楼 xiaozejun 的回复:
这个问题正在学习中 过来向高手学习学习 帮顶  楼主解决问题后 请记得 详细讲一下解决方法 让我们也好好学习 哈哈哈哈

你还真 傻!!!!

#6


个人感觉是编码的问题

#7


参考 http://www.javaeye.com/topic/254015

1、是否字符编码问题

为了检查获取的字符串的编码是否正确,使用下面的方式尝试多种字符集编码的转换,但是都没有效果;

 

Java代码 
String message=“...”;//ws获取到的信息   
new String(message.getBytes("utf8"),"gbk");  

String message=“...”;//ws获取到的信息
new String(message.getBytes("utf8"),"gbk"); 

回过来仔细考虑了一下我们的系统,系统的jsp页面及数据库编码都是采用的utf-8编码,无论是录入、保存还是显示都没有出现中文乱码问题;尤其是系统之间多处使用ws方式同步数据,也没有出现乱码问题,于是认为ws获取到的信息同样是utf-8编码。为了验证这个想法,做了一个jsp页面,使用utf-8的方式显示获取到的信息,在不经过任何转换的前提下,正确显示中文。最终确定,不是字符集编码的问题。

 

2、是否打印过程发生了问题

查看了JDK API的说明,发现在使用字体的时候,我没有特别设定,使用了默认字体。写了一个简单的输出平台默认字体的类,得到的字体却是一样的信息:

 

Java代码 
Default font:java.awt.Font[family=Dialog,name=Dialog,style=plain,size=12]  

Default font:java.awt.Font[family=Dialog,name=Dialog,style=plain,size=12] 于是到网上查找“java drawString 中文乱码” 关键字信息,查找csdn的一条信息:http://topic.csdn.net/u/20080603/13/3590c1f9-30bc-4e4d-bb2a-ada472b05973.html。大家可以去看一下,我就不贴过来了。我的动作是:

1) 指定打印到图片的字体为中文

 

Java代码 
g2d.setFont(new Font("宋体", Font.PLAIN, 12));  

g2d.setFont(new Font("宋体", Font.PLAIN, 12)); 

2) 上传WinXp 中的宋体字体文件到服务器(Solaris)

我的本地字体文件地址是“C:\WINDOWS\Fonts\simsun.ttc”,上传到服务器地址是:“/usr/jdk/instances/jdk1.5.0/jre/lib/fonts/simsun.ttc”

3) 通过验证程序,确定图片上的小方块正确显示为中文

 

打印图片中文乱码问题到这里就解决了。

#8


怎么样叫出现乱码啊

#9


用unicode哇

g.drawString("\u4e2d\u6587",100,100);


怎么把中文转换成unicode呢?

可以直接用下面的这个类

public class unicodeChanging {   
    public static void main(String[] args) {   
        String s = "中文";   
        String tt = gbEncoding(s);   
       System.out.println(decodeUnicode(tt));   
   }   
  
  
   public static String gbEncoding(final String gbString) {   
        char[] utfBytes = gbString.toCharArray();   
        String unicodeBytes = "";   
       for (int byteIndex = 0; byteIndex < utfBytes.length; byteIndex++) {   
            String hexB = Integer.toHexString(utfBytes[byteIndex]);   
            if (hexB.length() <= 2) {   
               hexB = "00" + hexB;   
           }   
        unicodeBytes = unicodeBytes + "\\u" + hexB;   
       }   
    System.out.println("unicodeBytes is: " + unicodeBytes);   
        return unicodeBytes;   
   }   
  
   public static String decodeUnicode(final String dataStr) {   
        int start = 0;   
       int end = 0;   
       final StringBuffer buffer = new StringBuffer();   
    while (start > -1) {   
           end = dataStr.indexOf("\\u", start + 2);   
            String charStr = "";   
            if (end == -1) {   
                charStr = dataStr.substring(start + 2, dataStr.length());   
          } else {   
               charStr = dataStr.substring(start + 2, end);   
            }   
        char letter = (char) Integer.parseInt(charStr, 16); 
           buffer.append(new Character(letter).toString());   
        start = end;   
       }   
       return buffer.toString();   
    }   
}  

#10


你先看一下,你的DOS下有没有中文乱码
如果有的话,按照2楼的改就可以了,或者是写一个注册表文件导入就可以了。
一般是这个问题。我之前也遇到过。

#11


呵呵~问题解决了,原来是字体的原因,谢谢各位的回复

#1


该回复于2009-08-18 21:51:44被版主删除

#2


没弄过,是不是字符编码的问题?在eclipse中设置如下:
windows->Preferences...打开"首选项"对话框,左侧导航树,导航到 general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。 

#3


可能是eclipse的编码设置问题,

#4


可能是字体的原因

#5


引用 1 楼 xiaozejun 的回复:
这个问题正在学习中 过来向高手学习学习 帮顶  楼主解决问题后 请记得 详细讲一下解决方法 让我们也好好学习 哈哈哈哈

你还真 傻!!!!

#6


个人感觉是编码的问题

#7


参考 http://www.javaeye.com/topic/254015

1、是否字符编码问题

为了检查获取的字符串的编码是否正确,使用下面的方式尝试多种字符集编码的转换,但是都没有效果;

 

Java代码 
String message=“...”;//ws获取到的信息   
new String(message.getBytes("utf8"),"gbk");  

String message=“...”;//ws获取到的信息
new String(message.getBytes("utf8"),"gbk"); 

回过来仔细考虑了一下我们的系统,系统的jsp页面及数据库编码都是采用的utf-8编码,无论是录入、保存还是显示都没有出现中文乱码问题;尤其是系统之间多处使用ws方式同步数据,也没有出现乱码问题,于是认为ws获取到的信息同样是utf-8编码。为了验证这个想法,做了一个jsp页面,使用utf-8的方式显示获取到的信息,在不经过任何转换的前提下,正确显示中文。最终确定,不是字符集编码的问题。

 

2、是否打印过程发生了问题

查看了JDK API的说明,发现在使用字体的时候,我没有特别设定,使用了默认字体。写了一个简单的输出平台默认字体的类,得到的字体却是一样的信息:

 

Java代码 
Default font:java.awt.Font[family=Dialog,name=Dialog,style=plain,size=12]  

Default font:java.awt.Font[family=Dialog,name=Dialog,style=plain,size=12] 于是到网上查找“java drawString 中文乱码” 关键字信息,查找csdn的一条信息:http://topic.csdn.net/u/20080603/13/3590c1f9-30bc-4e4d-bb2a-ada472b05973.html。大家可以去看一下,我就不贴过来了。我的动作是:

1) 指定打印到图片的字体为中文

 

Java代码 
g2d.setFont(new Font("宋体", Font.PLAIN, 12));  

g2d.setFont(new Font("宋体", Font.PLAIN, 12)); 

2) 上传WinXp 中的宋体字体文件到服务器(Solaris)

我的本地字体文件地址是“C:\WINDOWS\Fonts\simsun.ttc”,上传到服务器地址是:“/usr/jdk/instances/jdk1.5.0/jre/lib/fonts/simsun.ttc”

3) 通过验证程序,确定图片上的小方块正确显示为中文

 

打印图片中文乱码问题到这里就解决了。

#8


怎么样叫出现乱码啊

#9


用unicode哇

g.drawString("\u4e2d\u6587",100,100);


怎么把中文转换成unicode呢?

可以直接用下面的这个类

public class unicodeChanging {   
    public static void main(String[] args) {   
        String s = "中文";   
        String tt = gbEncoding(s);   
       System.out.println(decodeUnicode(tt));   
   }   
  
  
   public static String gbEncoding(final String gbString) {   
        char[] utfBytes = gbString.toCharArray();   
        String unicodeBytes = "";   
       for (int byteIndex = 0; byteIndex < utfBytes.length; byteIndex++) {   
            String hexB = Integer.toHexString(utfBytes[byteIndex]);   
            if (hexB.length() <= 2) {   
               hexB = "00" + hexB;   
           }   
        unicodeBytes = unicodeBytes + "\\u" + hexB;   
       }   
    System.out.println("unicodeBytes is: " + unicodeBytes);   
        return unicodeBytes;   
   }   
  
   public static String decodeUnicode(final String dataStr) {   
        int start = 0;   
       int end = 0;   
       final StringBuffer buffer = new StringBuffer();   
    while (start > -1) {   
           end = dataStr.indexOf("\\u", start + 2);   
            String charStr = "";   
            if (end == -1) {   
                charStr = dataStr.substring(start + 2, dataStr.length());   
          } else {   
               charStr = dataStr.substring(start + 2, end);   
            }   
        char letter = (char) Integer.parseInt(charStr, 16); 
           buffer.append(new Character(letter).toString());   
        start = end;   
       }   
       return buffer.toString();   
    }   
}  

#10


你先看一下,你的DOS下有没有中文乱码
如果有的话,按照2楼的改就可以了,或者是写一个注册表文件导入就可以了。
一般是这个问题。我之前也遇到过。

#11


呵呵~问题解决了,原来是字体的原因,谢谢各位的回复