第一部分:
如何将GBK编码转换成Unicode码??
读流: InputStreamReader(InputStream_in,"GBK")
写流: OutputStreamWriter(OutputStream_out,"GBK")
实验解决:
文件(test.txt):
UNICODE双字节字符集 Unicode:(DoubleByte Charsets) |
程序:
package org.test3;
import java.io.*;
public class Test3
{
public static void main(String[] args) throws IOException
{
FileInputStream fis = new FileInputStream( "E://testproject//test.txt" );
InputStreamReader isr = new InputStreamReader( fis, "GBK" ); //是GBK=>Unicode
BufferedReader br = new BufferedReader( isr );
int ch;
ch = br.read();
while( ch>-1 )
{
System.out.println( "char["+(char)ch+"]/t"
+ "int=" + ch + "/t//u"
+ "hex=" + Integer.toHexString(ch).toUpperCase() );
ch = br.read();
}
}
}
结果显示:
char[U] int=85 /uhex=55
char[N] int=78 /uhex=4E
char[I] int=73 /uhex=49
char[C] int=67 /uhex=43
char[O] int=79 /uhex=4F
char[D] int=68 /uhex=44
char[E] int=69 /uhex=45
char[双] int=21452 /uhex=53CC
char[字] int=23383 /uhex=5B57
char[节] int=33410 /uhex=8282
char[字] int=23383 /uhex=5B57
char[符] int=31526 /uhex=7B26
char[集] int=38598 /uhex=96C6
char[
] int=13 /uhex=D
char[
] int=10 /uhex=A
char[所] int=25152 /uhex=6240
char[以] int=20197 /uhex=4EE5
char[你] int=20320 /uhex=4F60
char[可] int=21487 /uhex=53EF
char[以] int=20197 /uhex=4EE5
char[把] int=25226 /uhex=628A
char[U] int=85 /uhex=55
char[N] int=78 /uhex=4E
char[I] int=73 /uhex=49
char[C] int=67 /uhex=43
char[O] int=79 /uhex=4F
char[D] int=68 /uhex=44
char[E] int=69 /uhex=45
char[想] int=24819 /uhex=60F3
char[象] int=35937 /uhex=8C61
char[成] int=25104 /uhex=6210
char[这] int=36825 /uhex=8FD9
char[样] int=26679 /uhex=6837
char[:] int=65306 /uhex=FF1A
char[让] int=35753 /uhex=8BA9
char[所] int=25152 /uhex=6240
char[有] int=26377 /uhex=6709
char[的] int=30340 /uhex=7684
char[字] int=23383 /uhex=5B57
char[符] int=31526 /uhex=7B26
char[(] int=65288 /uhex=FF08
char[包] int=21253 /uhex=5305
char[括] int=25324 /uhex=62EC
char[英] int=33521 /uhex=82F1
char[文] int=25991 /uhex=6587
char[)] int=65289 /uhex=FF09
char[都] int=37117 /uhex=90FD
char[用] int=29992 /uhex=7528
char[2] int=50 /uhex=32
char[个] int=20010 /uhex=4E2A
char[字] int=23383 /uhex=5B57
char[节] int=33410 /uhex=8282
char[(] int=65288 /uhex=FF08
char[2] int=50 /uhex=32
char[个] int=20010 /uhex=4E2A
char[8] int=56 /uhex=38
char[位] int=20301 /uhex=4F4D
char[)] int=65289 /uhex=FF09
char[表] int=34920 /uhex=8868
char[示] int=31034 /uhex=793A
char[,] int=65292 /uhex=FF0C
char[这] int=36825 /uhex=8FD9
char[样] int=26679 /uhex=6837
char[就] int=23601 /uhex=5C31
char[有] int=26377 /uhex=6709
char[了] int=20102 /uhex=4E86
char[一] int=19968 /uhex=4E00
char[个] int=20010 /uhex=4E2A
char[2] int=50 /uhex=32
char[^] int=94 /uhex=5E
char[(] int=40 /uhex=28
char[8] int=56 /uhex=38
char[*] int=42 /uhex=2A
char[2] int=50 /uhex=32
char[)] int=41 /uhex=29
char[ ] int=32 /uhex=20
char[=] int=61 /uhex=3D
char[ ] int=32 /uhex=20
char[2] int=50 /uhex=32
char[5] int=53 /uhex=35
char[6] int=54 /uhex=36
char[ ] int=32 /uhex=20
char[*] int=42 /uhex=2A
char[ ] int=32 /uhex=20
char[2] int=50 /uhex=32
char[5] int=53 /uhex=35
char[6] int=54 /uhex=36
char[ ] int=32 /uhex=20
char[=] int=61 /uhex=3D
char[ ] int=32 /uhex=20
char[6] int=54 /uhex=36
char[5] int=53 /uhex=35
char[5] int=53 /uhex=35
char[3] int=51 /uhex=33
char[6] int=54 /uhex=36
char[个] int=20010 /uhex=4E2A
char[格] int=26684 /uhex=683C
char[子] int=23376 /uhex=5B50
char[的] int=30340 /uhex=7684
char[大] int=22823 /uhex=5927
char[棋] int=26827 /uhex=68CB
char[盘] int=30424 /uhex=76D8
char[。] int=12290 /uhex=3002
char[在] int=22312 /uhex=5728
char[这] int=36825 /uhex=8FD9
char[个] int=20010 /uhex=4E2A
char[棋] int=26827 /uhex=68CB
char[盘] int=30424 /uhex=76D8
char[中] int=20013 /uhex=4E2D
char[,] int=65292 /uhex=FF0C
char[这] int=36825 /uhex=8FD9
char[样] int=26679 /uhex=6837
char[中] int=20013 /uhex=4E2D
char[(] int=65288 /uhex=FF08
char[简] int=31616 /uhex=7B80
char[繁] int=32321 /uhex=7E41
char[)] int=65289 /uhex=FF09
char[日] int=26085 /uhex=65E5
char[韩] int=38889 /uhex=97E9
char[(] int=65288 /uhex=FF08
char[还] int=36824 /uhex=8FD8
char[包] int=21253 /uhex=5305
char[括] int=25324 /uhex=62EC
char[越] int=36234 /uhex=8D8A
char[南] int=21335 /uhex=5357
char[)] int=65289 /uhex=FF09
char[文] int=25991 /uhex=6587
char[字] int=23383 /uhex=5B57
char[作] int=20316 /uhex=4F5C
char[为] int=20026 /uhex=4E3A
char[C] int=67 /uhex=43
char[J] int=74 /uhex=4A
char[K] int=75 /uhex=4B
char[字] int=23383 /uhex=5B57
char[符] int=31526 /uhex=7B26
char[集] int=38598 /uhex=96C6
char[都] int=37117 /uhex=90FD
char[放] int=25918 /uhex=653E
char[在] int=22312 /uhex=5728
char[一] int=19968 /uhex=4E00
char[定] int=23450 /uhex=5B9A
char[的] int=30340 /uhex=7684
char[区] int=21306 /uhex=533A
char[位] int=20301 /uhex=4F4D
char[内] int=20869 /uhex=5185
char[,] int=65292 /uhex=FF0C
char[为] int=20026 /uhex=4E3A
char[了] int=20102 /uhex=4E86
char[减] int=20943 /uhex=51CF
char[少] int=23569 /uhex=5C11
char[重] int=37325 /uhex=91CD
char[复] int=22797 /uhex=590D
char[,] int=65292 /uhex=FF0C
char[各] int=21508 /uhex=5404
char[种] int=31181 /uhex=79CD
char[语] int=35821 /uhex=8BED
char[言] int=35328 /uhex=8A00
char[中] int=20013 /uhex=4E2D
char[写] int=20889 /uhex=5199
char[法] int=27861 /uhex=6CD5
char[一] int=19968 /uhex=4E00
char[样] int=26679 /uhex=6837
char[的] int=30340 /uhex=7684
char[字] int=23383 /uhex=5B57
char[共] int=20849 /uhex=5171
char[享] int=20139 /uhex=4EAB
char[一] int=19968 /uhex=4E00
char[个] int=20010 /uhex=4E2A
char[“] int=8220 /uhex=201C
char[棋] int=26827 /uhex=68CB
char[格] int=26684 /uhex=683C
char[”] int=8221 /uhex=201D
char[。] int=12290 /uhex=3002
char[详] int=35814 /uhex=8BE6
char[细] int=32454 /uhex=7EC6
char[的] int=30340 /uhex=7684
char[区] int=21306 /uhex=533A
char[位] int=20301 /uhex=4F4D
char[见] int=35265 /uhex=89C1
char[附] int=38468 /uhex=9644
char[录] int=24405 /uhex=5F55
char[A] int=65 /uhex=41
char[
] int=13 /uhex=D
char[
] int=10 /uhex=A
char[
] int=13 /uhex=D
char[
] int=10 /uhex=A
char[U] int=85 /uhex=55
char[n] int=110 /uhex=6E
char[i] int=105 /uhex=69
char[c] int=99 /uhex=63
char[o] int=111 /uhex=6F
char[d] int=100 /uhex=64
char[e] int=101 /uhex=65
char[:] int=65306 /uhex=FF1A
char[(] int=40 /uhex=28
char[D] int=68 /uhex=44
char[o] int=111 /uhex=6F
char[u] int=117 /uhex=75
char[b] int=98 /uhex=62
char[l] int=108 /uhex=6C
char[e] int=101 /uhex=65
char[B] int=66 /uhex=42
char[y] int=121 /uhex=79
char[t] int=116 /uhex=74
char[e] int=101 /uhex=65
char[ ] int=32 /uhex=20
char[C] int=67 /uhex=43
char[h] int=104 /uhex=68
char[a] int=97 /uhex=61
char[r] int=114 /uhex=72
char[s] int=115 /uhex=73
char[e] int=101 /uhex=65
char[t] int=116 /uhex=74
char[s] int=115 /uhex=73
char[)] int=41 /uhex=29
注释:
java工作处理编码模式
(1)java在运行期一律以unicode来存储字符,这样有利的支持了多语言环境.
(2)java在读取文件的时候默认是按照系统默认语言(字符集)编码来解码文件,读取和保存时候的编码不一致也导致程序中参数值错误,用FileInputStream类读取文件可以指定编码读取
(3)java在输出到系统界面时(windows)会把内存中变量字符再通过系统默认语言(字符集)编码去转换,所以在输出过程中也会碰到一系列的编码问题
JSP : 可以通过设置charset来解决
例如:<%@ page contentType="text/html;charset=gb2312" %>
数据库: java在数据库流中也会产生编码问题, 可以参照文件的方法,在接收流时以特定的字符集去解码
例如: 使用方法 InputStreamReader(InputStream in, Charset cs) 可以实现
swing/awt : 输出到系统界面解码时可以通过设置组件显示字体来替换系统字符集解码
例如:
public static void setFont(Font pFont)
{
UIManager.put("Button.font", pFont);
UIManager.put("ToggleButton.font", pFont);
UIManager.put("RadioButton.font", pFont);
UIManager.put("CheckBox.font", pFont);
UIManager.put("ColorChooser.font", pFont);
UIManager.put("ToggleButton.font", pFont);
UIManager.put("ComboBox.font", pFont);
UIManager.put("ComboBoxItem.font", pFont);
UIManager.put("InternalFrame.titleFont", pFont);
UIManager.put("Label.font", pFont);
UIManager.put("List.font", pFont);
UIManager.put("MenuBar.font", pFont);
UIManager.put("Menu.font", pFont);
UIManager.put("MenuItem.font", pFont);
UIManager.put("RadioButtonMenuItem.font", pFont);
UIManager.put("CheckBoxMenuItem.font", pFont);
UIManager.put("PopupMenu.font", pFont);
UIManager.put("OptionPane.font", pFont);
UIManager.put("Panel.font", pFont);
UIManager.put("ProgressBar.font", pFont);
UIManager.put("ScrollPane.font", pFont);
UIManager.put("Viewport", pFont);
UIManager.put("TabbedPane.font", pFont);
UIManager.put("TableHeader.font", pFont);
UIManager.put("Table.font", pFont);
UIManager.put("TextField.font", pFont);
UIManager.put("PasswordFiled.font", pFont);
UIManager.put("TextArea.font", pFont);
UIManager.put("TextPane.font", pFont);
UIManager.put("EditorPane.font", pFont);
UIManager.put("TitledBorder.font", pFont);
UIManager.put("ToolBar.font", pFont);
UIManager.put("ToolTip.font", pFont);
UIManager.put("Tree.font", pFont);
}
通过传递一个字体名称来控制软件输出的字符集,避免产生乱码
===================================================
第二部分:
一、转换成unicode
package org.test1;
import java.io.UnsupportedEncodingException;
import sun.io.ByteToCharConverter;
import sun.io.CharToByteConverter;
import sun.io.MalformedInputException;
public class Test
{
public static void main(String[] args) throws UnsupportedEncodingException,
MalformedInputException
{
String str = "您";
char[] c = str.toCharArray();
for (int i = 0; i < c.length; i++)
{
System.out.println(Integer.toHexString(c[i]));
}
System.out.println(c.length);
String encoding = "gb2312";
String str3 = "您好 world";
byte b3[] = str3.getBytes(encoding);
System.out.println( System.getProperty( "file.encoding" ) );
ByteToCharConverter converter = ByteToCharConverter
.getConverter(encoding);
char[] c3 = converter.convertAll(b3);
for (int i = 0; i < c3.length; i++)
{
System.out.println(Integer.toHexString(c3[i]));
}
CharToByteConverter con = CharToByteConverter.getConverter("GB2312");
char[] ch = { '/u4f60', '/u597d' };
byte[] b2 = con.convertAll(ch);
String str2 = new String(b2, "GB2312");
System.out.println(str2);
}
}
二、从unicode转换