Java学习笔记之中文字符初步解决方案的内容分析
Java学习笔记之中文字符初步解决方案的内容分析
前言:一提起数据库偶就心血来潮温故了下以前的东西。记得以前就被一个数据库写入读取时候遇到的中文字节编码的问题给懵了半天,后来以我三天打鱼两天晒网的生活习惯,我就放那里没理他了,反正也没什么要我急于解决的。最近要弄那个密码和ID的验证,必须用到数据库了这次,本来也是,不准备放用户名的,但是后来玩着玩着感觉这样全输入英文的太不爽了,当然就要解决这个问题来了,不过稍微看了下,基本程序能用了,就是老要转换编码很是麻烦。
这个是临时我没事做了个测试用的JFrame,老单独设置蛮麻烦的,于是就独立一个出来,以后测试都用它就行了,呵呵。
/*
*一个窗口的公共类
*
*/
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassSosoFrameextendsJFrame{
privateJTextAreajta=null;
privateJTextFieldjtf=null;
privateJButtonjbOK=null;
privateJButtonjbCancel=null;
publicSosoFrame(Stringname){
super(name);
jbOK=newJButton("确定");
jbCancel=newJButton("取消");
JPaneljpSouth=newJPanel(newFlowLayout());
jta=newJTextArea();
jta.setRows(5);
jta.setEditable(false);
jtf=newJTextField(20);
jpSouth.add(jtf);
jpSouth.add(jbOK);
jpSouth.add(jbCancel);
JScrollPanejsp=newJScrollPane(jta);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(newJLabel("Soso'sFrame"),BorderLayout.NORTH);
this.add(jsp,BorderLayout.CENTER);
this.add(jpSouth,BorderLayout.SOUTH);
}
publicvoiddisplay(booleanshow){
this.pack();
if(show){
this.setVisible(true);
}
else{
this.setVisible(false);
}
}
publicJTextFieldgetTextField(){
returnjtf;
}
publicJTextAreagetTextArea(){
returnjta;
}
publicJButtongetButtons(intc){
switch(c){
case1:
returnthis.jbOK;
case2:
returnthis.jbCancel;
}
returnnull;
}
publicvoidjtaAppend(Stringcontent){
jta.append(content+" ");
}
}
*一个窗口的公共类
*
*/
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassSosoFrameextendsJFrame{
privateJTextAreajta=null;
privateJTextFieldjtf=null;
privateJButtonjbOK=null;
privateJButtonjbCancel=null;
publicSosoFrame(Stringname){
super(name);
jbOK=newJButton("确定");
jbCancel=newJButton("取消");
JPaneljpSouth=newJPanel(newFlowLayout());
jta=newJTextArea();
jta.setRows(5);
jta.setEditable(false);
jtf=newJTextField(20);
jpSouth.add(jtf);
jpSouth.add(jbOK);
jpSouth.add(jbCancel);
JScrollPanejsp=newJScrollPane(jta);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(newJLabel("Soso'sFrame"),BorderLayout.NORTH);
this.add(jsp,BorderLayout.CENTER);
this.add(jpSouth,BorderLayout.SOUTH);
}
publicvoiddisplay(booleanshow){
this.pack();
if(show){
this.setVisible(true);
}
else{
this.setVisible(false);
}
}
publicJTextFieldgetTextField(){
returnjtf;
}
publicJTextAreagetTextArea(){
returnjta;
}
publicJButtongetButtons(intc){
switch(c){
case1:
returnthis.jbOK;
case2:
returnthis.jbCancel;
}
returnnull;
}
publicvoidjtaAppend(Stringcontent){
jta.append(content+" ");
}
}
下面是个数据库的连接显示文件:
/*
*MySql数据库的中文输入问题
*
*/
importjava.sql.*;
importjava.io.*;
importjava.awt.event.*;
importjavax.swing.*;
classMySQLDB{
publicstaticConnectiongetConnection()throwsSQLException,java.lang.ClassNotFoundException{
//数据库名称
Stringdbname="test";
//取得连接的url
Stringurl="jdbc:mysql://localhost:3306/"+dbname;
//加载MySQL的jdbc驱动
Class.forName("org.gjt.mm.mysql.Driver");
//使用能访问MySQL数据库的用户名root
StringuserName="root";
//使用口令
Stringpassword="admin";
//打开数据库连接
Connectioncon=DriverManager.getConnection(url,userName,password);
returncon;
}
publicstaticvoidmain(String[]args){
finalSosoFrameframe=newSosoFrame("数据库测试");
frame.jtaAppend("数据库测试,这里是显示区域");
finalJButtonjbCancel=frame.getButtons(2);
finalJButtonjbOK=frame.getButtons(1);
jbCancel.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente){
System.exit(0);
}
}
);
jbOK.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente){
//System.exit(0);
//读取数据库!
if(!frame.getTextField().getText().trim().equals("")){
}
}
}
);
frame.display(true);
try{
//BufferedReaderbuffReader=null;
Connectioncon=getConnection();
Statementstmt=con.createStatement();
Stringsql=newString("insertintotest(name)values('丁丁')");
sql=newString(sql.getBytes("GBK"),"8859_1");
stmt.executeUpdate(sql);
ResultSetrs=stmt.executeQuery("select*fromtest");
while(rs.next()){
intid=rs.getInt(1);
Stringname=newString(rs.getString(2).getBytes("8859_1"),"GBK");
frame.jtaAppend(id+""+name);
}
rs.close();
stmt.close();
con.close();
//buffReader.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
}
*MySql数据库的中文输入问题
*
*/
importjava.sql.*;
importjava.io.*;
importjava.awt.event.*;
importjavax.swing.*;
classMySQLDB{
publicstaticConnectiongetConnection()throwsSQLException,java.lang.ClassNotFoundException{
//数据库名称
Stringdbname="test";
//取得连接的url
Stringurl="jdbc:mysql://localhost:3306/"+dbname;
//加载MySQL的jdbc驱动
Class.forName("org.gjt.mm.mysql.Driver");
//使用能访问MySQL数据库的用户名root
StringuserName="root";
//使用口令
Stringpassword="admin";
//打开数据库连接
Connectioncon=DriverManager.getConnection(url,userName,password);
returncon;
}
publicstaticvoidmain(String[]args){
finalSosoFrameframe=newSosoFrame("数据库测试");
frame.jtaAppend("数据库测试,这里是显示区域");
finalJButtonjbCancel=frame.getButtons(2);
finalJButtonjbOK=frame.getButtons(1);
jbCancel.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente){
System.exit(0);
}
}
);
jbOK.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente){
//System.exit(0);
//读取数据库!
if(!frame.getTextField().getText().trim().equals("")){
}
}
}
);
frame.display(true);
try{
//BufferedReaderbuffReader=null;
Connectioncon=getConnection();
Statementstmt=con.createStatement();
Stringsql=newString("insertintotest(name)values('丁丁')");
sql=newString(sql.getBytes("GBK"),"8859_1");
stmt.executeUpdate(sql);
ResultSetrs=stmt.executeQuery("select*fromtest");
while(rs.next()){
intid=rs.getInt(1);
Stringname=newString(rs.getString(2).getBytes("8859_1"),"GBK");
frame.jtaAppend(id+""+name);
}
rs.close();
stmt.close();
con.close();
//buffReader.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
}
做了些基本的,也就插插读读的。读出来的时候一定要以8859_1的格式读入,并且转换成GBK的,当然如果是中文操作系统就默认是GBK的,写入的时候要指定写入流为8859_1的,不然是乱码,也就只能麻烦自己手一点了,哎~苦命那……
昨天太急匆匆了,忘记说了,我用的是MYSQL4.1,装好后是用utf8编码格式的。
后参考了个很爽的地方:http://imysql.cn/,里面东西蛮全蛮多的,呵呵,关心MySQL的朋友不妨去看看,会有很大帮助的。说实话,最近看了好多关于编码集的文章,脑子里面着实有点乱!!
经过不容易的修改,终于把最后的方案定下来了(只是这个测试用的方案,嘿嘿)
/*
*MySql数据库的中文输入问题
*
*/
importjava.sql.*;
importjava.io.*;
importjava.awt.event.*;
importjavax.swing.*;
classMySQLDB{
publicstaticConnectiongetConnection()throwsSQLException,java.lang.ClassNotFoundException{
//数据库名称
Stringdbname="latin";
//取得连接的url
Stringurl="jdbc:mysql://localhost:3306/"+dbname;
//加载MySQL的jdbc驱动
Class.forName("org.gjt.mm.mysql.Driver");
//使用能访问MySQL数据库的用户名root
StringuserName="root";
//使用口令
Stringpassword="admin";
*MySql数据库的中文输入问题
*
*/
importjava.sql.*;
importjava.io.*;
importjava.awt.event.*;
importjavax.swing.*;
classMySQLDB{
publicstaticConnectiongetConnection()throwsSQLException,java.lang.ClassNotFoundException{
//数据库名称
Stringdbname="latin";
//取得连接的url
Stringurl="jdbc:mysql://localhost:3306/"+dbname;
//加载MySQL的jdbc驱动
Class.forName("org.gjt.mm.mysql.Driver");
//使用能访问MySQL数据库的用户名root
StringuserName="root";
//使用口令
Stringpassword="admin";