static public String UTF2GB(String utfString) { StringTokenizer st = new StringTokenizer(utfString,"\\u"); StringBuffer sb = new StringBuffer(); while(st.hasMoreTokens()) { String ii = st.nextToken(); int x = Integer.parseInt(ii,16); char c = (char)x; sb.append(c); } return sb.toString(); }
to sharetop: 第一次我回复的时候的确没明白需求,但当你第二次回复后我明白了楼主的需要。 我一直觉得出现这个问题主要是楼主对JAVA如何处理字符集和UNICODE编码的理解有偏差,而要解决只要将UNICODE直接输出就可以了,其他的不是麻烦事情。“char c1=(char)Integer.parseInt(s1,16)” ljp3000(中文昵称制订中) 也早就提出了。 而你和6leaf觉得这个问题主要麻烦的在于对UNICODE形式字符串的操作。 所以我没搞懂为什么你们还在讨论这个问题。 实现程序还有很多,但不外乎直接将UNICODE形式输出。
package mytest;import java.awt.*; import java.lang.StringBuffer; import java.util.StringTokenizer; import javax.swing.*; import com.borland.jbcl.layout.*; import java.awt.event.*;public class myFrame extends JFrame { JButton jButton1 = new JButton(); JPanel jPanel1 = new JPanel(); JTextArea jTextArea1 = new JTextArea(); JTextArea jTextArea2 = new JTextArea(); XYLayout xYLayout1 = new XYLayout(); public myFrame() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { myFrame myFrame = new myFrame(); } private void jbInit() throws Exception { jButton1.setText("change"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { jButton1_actionPerformed(e); } }); jTextArea2.setBorder(BorderFactory.createEtchedBorder()); jTextArea2.setPreferredSize(new Dimension(160, 17)); jTextArea1.setBorder(BorderFactory.createEtchedBorder()); jTextArea1.setPreferredSize(new Dimension(160, 17)); jPanel1.setLayout(xYLayout1); this.getContentPane().add(jButton1, BorderLayout.SOUTH); this.getContentPane().add(jPanel1, BorderLayout.CENTER); jPanel1.add(jTextArea1, new XYConstraints(15, 119, -1, -1)); jPanel1.add(jTextArea2, new XYConstraints(206, 119, -1, -1)); this.show(); } void jButton1_actionPerformed(ActionEvent e) { String str=jTextArea1.getText(); String str2=""; // char[] ch=new char[str.length()]; // str.getChars(0,str.length(),ch,0); // System.out.println(str.lastIndexOf("\\u")); StringTokenizer st = new StringTokenizer(str,"\\u"); StringBuffer sb = new StringBuffer(); while(st.hasMoreTokens()) { String tmpstr = st.nextToken(); int x = Integer.parseInt(tmpstr,16); char c = (char)x; sb.append(c); } str2+=sb.toString(); //str2=new String(str); /*for(int i=0;i<str.length();i=i+6){ String strtmp=new String(ch[i]+""+ch[i+1]+""+ch[i+2]+""+ch[i+3]+""+ch[i+4]+""+ch[i+5]); str2+=strtmp; }*/ jTextArea2.setText(str2); } } 应该可以了!大家试验一下吧!
to salute() :多谢,二愣子给的代码让我明白了其实操作字串也不算太麻烦,是我想得复杂了。我一直以为有什么直接的方法。 也许这就是唯一的处理方式了。
底下封住的两都可以实现同样的功能。试试看。
String str = "\u865A\u7EBF";
try
{
//String s1 =(String)str;
String s1 =new String(str);
// new String(str.getBytes(),"GBK");
System.out.println("字符:" + s1);
}
catch(Exception ee6)
{
}
String str="\u865A\u7EBF";
System.out.println(str);我现在碰到的问题是,如果在Swing的JTextArea 中输入的字符已经是Unicode的编码符号,我必须取得这些符号串,并把它转换为正常的中文字符,然后给其它的component使用,不知道大家是否明白我的意思
这样处理是行不通的!
本来这个就是可以直接输出中文的,楼上步骤真是多余。如果你想在编辑时能看明白是什么意思,就用native2ascii吧,是jdk提供的工具,可以双向转换。
不好意思,还是没回答到点子上:)因为我还是不明白你的意思,是说用jtextarea编辑一个unicode的文本,然后传给另一个jtextarea,要显示成中文,是吗?
因为输入的字符本身就是Unicode码,不管你的系统设成什么都是没有用的。
说白了,我的目的就是要对Unicode码强制转换GB2312或GBK码。
UNICODE是编码,GBK是字符集。根本就不是一回事,你怎么转?
在一个TextField输入“4e00”文本,要求得到UNICODE码为4e00的汉字吗?
如果是的话那么应该可以这样
//TextField t1;
String s1=t1.getText();
char c1=(char)Integer.parseInt(s1,16);于是c1是UNICODE为4e00的汉字“一”.
我的目的就是想知道如何通过显式转换,把\u865A\u7EBF转为中文,即:"\u865A\u7EBF" ---> "虚线"注:"\u865A\u7EBF"为中文字符"虚线"的Unicode编码的表示形式
{
public static void main(String[] args)
{
String a=null;
try{
a= new String("\u865A\u7EBF");
}catch (Exception e)
{
System.out.println(e);
}
System.out.println(a);
}
}
以上代码在中文2000中正常显示!
"\u4E0D\u8981\u8FB9\u6846\uFF0C\u53EA\u52A0\u4E0B\u5212\u7EBF"
转换为其真正代表的中文字符串:
"不要边框,只加下划线"
UNICODE是字符编码规则,GBK是字符集。
你把你运行环境的字符集设成GBK,再把用UNICODE编码的中文字符打印出来,它会不是中文???
竟然还是难得好贴??
其次, 这位哥们说的是要分析一个字符串.
假如要将人家输入的\ud0e9\ucfdf转变成String,那么第一步要做的就是分析输入字符串,解析为byte[].以"虚线"为例, byte[0]=0xd0...byte[3]=0xdf.
第二步,构造新的字符串.
//************************************************************
to salute():你根本没有明白这里的问题。不要多说什么没用的话。现在需求是:你做两个JTextArea,其中一个显示unicode的字串,另一个显示相应的中文。你给出代码或解决方案吧。不管什么,你实现了再说吧。
//*********************************************************
但是在textarea得到的字符串其实是"\\u865a"
我明白你们在讨论什么!
要输出字符,总得有个字符集。JAVA中的字符串都是按UNICODE编码的,要以UNICODE样式输出,直接把它打出来不就得了。如果要按GBK样式输出,那就把系统字符集设为GBK,然后把它打出来,系统自己会帮你转的呀。
我当然明白你们在讨论什么!
要输出字符,总得有个字符集。JAVA中的字符串都是按UNICODE编码的,要以UNICODE样式输出,直接把它打出来不就得了。如果要按GBK样式输出,那就把系统字符集设为GBK,然后把它打出来,系统自己会帮你转的呀。
就是因为你的概念一开始错了,没有把问题表达清楚,所以才导致刚开始大家都没有看懂。
我再说一遍,JAVA中字符都是以UNICODE形式存放,而在输出的时候系统会根据系统设置自动帮你转化,包括2进制->10进制或者以某种字符集输出。你要的无非就是UNICODE不按任何字符集输出,那你把这个UNICODE字符(它的二进制)直接输出不就可以了。
至于方法,不有人早就写了嘛。
你这样吧,你做这么一个程序(花不了你多少时间的),你马上就会明白我提出的问题了,估计你现在还不明白我的意思,sharetop的理解是正确的程序测试要求:
建立一个Application ,在面板上建立两个JTextArea ,当你在其中一个输入Unicode编码,例如: \u865A\u7EBF ,另外一个JTextArea显示相应的中文字符: 虚线测试过你就明白了
char[] ch=new char[str.length()];
str.getChars(0,str.length(),ch,0);
for(int i=2;i<str.length();i=i+6){
String str2=new String(ch[i]+""+ch[i+1]+""+ch[i+2]+""+ch[i+3]);
System.out.println((char)Integer.parseInt(str2,16));
}
StringTokenizer st = new StringTokenizer(utfString,"\\u");
StringBuffer sb = new StringBuffer();
while(st.hasMoreTokens()) {
String ii = st.nextToken();
int x = Integer.parseInt(ii,16);
char c = (char)x;
sb.append(c);
}
return sb.toString();
}
第一次我回复的时候的确没明白需求,但当你第二次回复后我明白了楼主的需要。
我一直觉得出现这个问题主要是楼主对JAVA如何处理字符集和UNICODE编码的理解有偏差,而要解决只要将UNICODE直接输出就可以了,其他的不是麻烦事情。“char c1=(char)Integer.parseInt(s1,16)” ljp3000(中文昵称制订中) 也早就提出了。
而你和6leaf觉得这个问题主要麻烦的在于对UNICODE形式字符串的操作。
所以我没搞懂为什么你们还在讨论这个问题。
实现程序还有很多,但不外乎直接将UNICODE形式输出。
import java.lang.StringBuffer;
import java.util.StringTokenizer;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.awt.event.*;public class myFrame extends JFrame {
JButton jButton1 = new JButton();
JPanel jPanel1 = new JPanel();
JTextArea jTextArea1 = new JTextArea();
JTextArea jTextArea2 = new JTextArea();
XYLayout xYLayout1 = new XYLayout(); public myFrame() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
myFrame myFrame = new myFrame();
}
private void jbInit() throws Exception {
jButton1.setText("change");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
jTextArea2.setBorder(BorderFactory.createEtchedBorder());
jTextArea2.setPreferredSize(new Dimension(160, 17));
jTextArea1.setBorder(BorderFactory.createEtchedBorder());
jTextArea1.setPreferredSize(new Dimension(160, 17));
jPanel1.setLayout(xYLayout1);
this.getContentPane().add(jButton1, BorderLayout.SOUTH);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jTextArea1, new XYConstraints(15, 119, -1, -1));
jPanel1.add(jTextArea2, new XYConstraints(206, 119, -1, -1));
this.show();
} void jButton1_actionPerformed(ActionEvent e) {
String str=jTextArea1.getText();
String str2="";
// char[] ch=new char[str.length()];
// str.getChars(0,str.length(),ch,0);
// System.out.println(str.lastIndexOf("\\u"));
StringTokenizer st = new StringTokenizer(str,"\\u");
StringBuffer sb = new StringBuffer();
while(st.hasMoreTokens()) {
String tmpstr = st.nextToken();
int x = Integer.parseInt(tmpstr,16);
char c = (char)x;
sb.append(c);
}
str2+=sb.toString();
//str2=new String(str);
/*for(int i=0;i<str.length();i=i+6){ String strtmp=new String(ch[i]+""+ch[i+1]+""+ch[i+2]+""+ch[i+3]+""+ch[i+4]+""+ch[i+5]);
str2+=strtmp;
}*/
jTextArea2.setText(str2); }
}
应该可以了!大家试验一下吧!
也许这就是唯一的处理方式了。
剩下来就是一个个切开然后转换再拼上了
放在一个方法里也不是很麻烦
其实我知道用 ljp3000(中文昵称制订中)是可以实现的,
只是我还是希望可以有更直接转换方法来解决的,结果还是没有办法,看来也只能这样一个一个的转,呵呵
ok,结贴!
Copyright=\u5b66\u97ec\u8f6f\u4ef6\u5de5\u4f5c\u5ba4 \u7248\u6743\u6240\u6709(C)2002下面是一个完整有用的代码: private String UnicodeToGB2312(String str){
String res = null;
StringBuffer sb=new StringBuffer();
try{
while(str.length()>0 ){
if( str.startsWith("\\u") ){
int x=Integer.parseInt(str.substring(2,6),16);
sb.append((char)x);
str=str.substring(6);
}
else{
sb.append(str.charAt(0));
str=str.substring(1);
}
}
res= sb.toString();
}
catch(Exception e){
e.printStackTrace(System.err);
}
return res;
}