java输出全部unicode字符
Java显示所有的Unicode 字符,代码主要是使用Java.awt.Graphics
的drawChars()方法,来绘出Unicode 字符。在设计符合国际化的程序过程当中,仅仅能够显示本地字符是不够的,只用Unicode
字符集才能够满足同时显示多国语言字符的需要。本实例实现了如何显示Unicode 字符的方法。
Java显示所有Unicode 字符编写方法:
1.编写UnicodeDisplay 类,该类继承了Jframe 类,实现了ActionListener
接口,该类是为了显示一个图形化的界面而实现的一个显示框架类,该类负责初始化显示窗口以及负责与用户交互,按照用户指定的字体以及风格改变
Unicode 的显示,代码如下:
// 导入所需要的Java 类库
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class UnicodeDisplay extends JFrame implements ActionListener {
int page = 0;
UnicodePanel p;
JScrollBar b;
String fontfamily = "Serif";
int fontstyle = Font.PLAIN;
/*构造函数,创建frame、菜单和滚动条*/
public UnicodeDisplay(String name) {
super(name);
p = new UnicodePanel(); // 创建panel
p.setBase((char)(page * 0x100)); // 初始化panel
getContentPane().add(p, "Center"); // 使其居中
// Create and set up a scrollbar, and put it on the right
b = new JScrollBar(Scrollbar.VERTICAL, 0, 1, 0, 0xFF);
b.setUnitIncrement(1);
b.setBlockIncrement(0x10);
b.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
page = e.getValue();
p.setBase((char)(page * 0x100));
}
});
getContentPane().add(b, "East");
// 设置消息响应函数处理关闭窗口请求
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
// 响应PageUP、PageDown、Up 和Down 按键
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
int oldpage = page;
if ((code == KeyEvent.VK_PAGE_UP) ||
(code == KeyEvent.VK_UP)) {
if (e.isShiftDown()) page -= 0x10;
else page -= 1;
if (page < 0) page = 0;
}
else if ((code == KeyEvent.VK_PAGE_DOWN) ||
(code == KeyEvent.VK_DOWN)) {
if (e.isShiftDown()) page += 0x10;
else page += 1;
if (page > 0xff) page = 0xff;
}
if (page != oldpage) { //如果改变了当前显示页
p.setBase((char) (page * 0x100)); // 更新显示
b.setValue(page); // 更新滚动条
}
}
});
// 建立可以改变显示字体的菜单.
JMenuBar menubar = new JMenuBar();
this.setJMenuBar(menubar);
menubar.add(makemenu("Font Family",
new String[] {"Serif", "SansSerif", "Monospaced"},
this));
menubar.add(makemenu("Font Style",
new String[]{
"Plain","Italic","Bold","BoldItalic"
}, this));
}
2.ActionPerformed()方法用于处理子菜单当中的各个选项:
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Serif")) fontfamily = "Serif";
else if (cmd.equals("SansSerif")) fontfamily = "SansSerif";
else if (cmd.equals("Monospaced")) fontfamily = "Monospaced";
else if (cmd.equals("Plain")) fontstyle = Font.PLAIN;
else if (cmd.equals("Italic")) fontstyle = Font.ITALIC;
else if (cmd.equals("Bold")) fontstyle = Font.BOLD;
else if (cmd.equals("BoldItalic")) fontstyle = Font.BOLD + Font.ITALIC;
p.setFont(fontfamily, fontstyle);
}
3.Makemenu()方法用于从数组当中创建菜单,代码如下:
private Jmenu makemenu(String name, String[] itemnames,
ActionListener listener)
{
Jmenu m = new Jmenu(name);
for(int I = 0; I < itemnames.length; I++) {
JmenuItem item = new JmenuItem(itemnames[I]);
item.addActionListener(listener);
item.setActionCommand(itemnames[I]);
m.add(item);
}
return m;
}
4.编写UnicodePanel 类,该类继承了Jcomponent,创建负责显示Unicode 的类UnicodePanel,它负责绘出一页(共有16×16=256 个)的Unicode 字符:
public static class UnicodePanel extends JComponent {
protected char base; // 指定我们显示的初始值
protected Font font = new Font("serif", Font.PLAIN, 18); // 指定缺省的显示字体
protected Font headingfont = new Font("monospaced", Font.BOLD, 18); // 指定缺省表头字体
static final int lineheight = 25; // 指定显示一行高度
static final int charspacing = 20; // 指定显示一个Unicode 字符宽度
static final int x0 = 65;
static final int y0 = 40;
/** 指定开始显示的初始字符并且刷新Panel */
public void setBase(char base) {
this.base = base;
repaint();
}
/**设定显示所用的新字体或者风格并且刷新Panel */
public void setFont(String family, int style) {
this.font = new Font(family, style, 18);
repaint();
}
/** 绘出字符表的一页 */
public void paintComponent(Graphics g) {
int start = (int)base & 0xFFF0; // 设置起始显示字符
// 使用给定字体显示表头
g.setFont(headingfont);
// 在顶端绘出0..F
for(int i=0; i < 16; i++) {
String s = Integer.toString(i, 16);
g.drawString(s, x0 + i*charspacing, y0-20);
}
// 绘出左边表头.
for(int i = 0; i < 16; i++) {
int j = start + i*16;
String s = Integer.toString(j, 16);
g.drawString(s, 10, y0+i*lineheight);
}
// 绘出Unicode 字符
g.setFont(font);
char[] c = new char[1];
for(int i = 0; i < 16; i++) {
for(int j = 0; j < 16; j++) {
c[0] = (char)(start + j*16 + i);
g.drawChars(c, 0, 1, x0 + i*charspacing, y0+j*lineheight);
}
}
}
/** 返回给定的分辨率 */
public Dimension getPreferredSize() {
return new Dimension(x0 + 16*charspacing,
y0 + 16*lineheight);
}
}
}
public class Test3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char c = 0;
for (; c < 65536; c++) {
System.out.print(c);
}
}
}
System.out.println(UnicodeToString(str));
把unicode字符还原的方法:
public static String UnicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4 }))");
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
}
return str;
}
System.out.print(c+"\t");
if(c%10==0) System.out.println();
}