栖息地

家园

#

(转作者:flyingroc8139出处:论坛整理)Java编程技术中汉字问题的分析及解决

Java编程技术中汉字问题的分析及解决

在基于 Java 语言的编程中,我们经常碰到汉字的 处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认的编码方式是UNICODE, 而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将 从汉字编码的常识入手,结合Java编程实例,分析以上两个问题并提出解决它们的方案。

现在 Java 编程语言已经广泛应用于互联网世界,早在 Sun 公司开发 Java 语言的时候,就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境(JRE)本身就分英文版和国际版,但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中,对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美,因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同,所以会有许多和汉字编码处理有关的问题在我们进 行应用开发中困扰着我们。有很多关于这些问题的解答,但都比较琐碎,并不能够满足大家迫切解决问题的愿望,关于 Java 中文问题的系统研究并不多,本文从汉字编码常识出发,分析 Java 中文问题,希望对大家解决这个问题有所帮助。

汉字编码的常识

我们知道,英文字符一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节 最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料,有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码,中华人民共和国国家标准汉字信息交换用编码,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标 码。两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编 码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41,UNICODE 就为0x00,0x41。利用特殊的工具各种编码之间可以互相转换。

Java 中文问题的初步认识

我们基于 Java 编程语言进行应用开发时,不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE,而我们通常使用的数据库及文件都是基于 GB2312 编码的,我们经常碰到这样的情况:浏览基于 JSP 技术的网站看到的是乱码,文件打开后看到的也是乱码,被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。

String sEnglish = “apple”;

String sChinese = “苹果”;

String s = “苹果 apple ”;

sEnglish 的长度是5,sChinese的长度是4,而 s 默认的长度是14。对于 sEnglish来说, Java 中的各个类都支持得非常好,肯定能够正确显示。但对于 sChinese 和 s 来说,虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持(默认 UNICODE 编码),但是如果操作系统的默认编码不是 UNICODE ,而是国标码等。从 Java 源代码到得到正确的结果,要经过 “Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备”的过程。在上述过程中的每一步骤,我们都必须正确地处理汉字的编码,才能够使最终的显示结果正确。

“ Java 源代码-> Java 字节码”,标准的 Java 编译器 javac 使用的字符集是系统默认的字符集,比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1,所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题,解决的办法就是在编译的时候添加 encoding 参数,这样才能够与平台无关。用法是

javac ?Cencoding GBK。

“ Java 字节码->虚拟机->操作系统”, Java 运行环境 (JRE) 分英文版和国际版,但只有国际版才支持非英文字符。 Java 开发工具包 (JDK) 肯定支持多国字符,但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ,都内嵌了 JRE 的国际版本,为自己支持多国字符提供了方便。

“操作系统->显示设备”,对于汉字来说,操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话,是肯定不能够显示中文的。

还有一个问题,就是在 Java 编程过程中,对中文字符进行正确的编码转换。例如,向网页输出中文字符串的时候,不论你是用

out.println(string);

还是用<%=string%>,都必须作 UNICODE 到 GBK 的转换,或者手动,或者自动。在 JSP 1.0中,可以定义输出字符集,从而实现内码的自动转换。用法是

<%@page contentType=”text/html;charset=gb2312” %>

但是在一些 JSP 版本中并没有提供对输出字符集的支持,(例如 JSP 0.92),这就需要手动编码输出了,方法非常多。最常用的方法是

String s1 = request.getParameter(“keyword”);

String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);

getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组,而“GBK” 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ,经过上述转换过程,在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串 s2 。

Java 中文问题的表层分析及处理

背景
开发环境 JDK1.15 Vcafe2.0 JPadPro
服务器端 NT IIS Sybase System Jconnect(JDBC)
客户端 IE5.0 Pwin98  

.CLASS 文件存放在服务器端,由客户端的浏览器运行 APPLET , APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ,TextArea,List,Choice 等。

I.用 JDBC 执行 SELECT 语句从服务器端读取数据(中文)后,将数据用 APPEND 方法加到 TextArea(TA) ,不能正确显示。但加到 List 中时,大部分汉字却可正确显示。

将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式 (Default Character Encoding) 转化为 STRING ,即可在 TA 和 List 中正确显示。

程序段如下:

dbstr2 = results.getString(1);
//After reading the result from DB server,converting it to string.
dbbyte1 = dbstr2.getBytes(“iso-8859-1”);
dbstr1 = new String(dbbyte1);

在转换字符串时不采用系统默认编码方式,而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下,从数据库取数据都没有问题。

II.处理方式与“取中文”相逆,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。

程序段如下:

sqlstmt = tf_input.getText();
//Before sending statement to DB server,converting it to sql statement.
dbbyte1 = sqlstmt.getBytes();
sqlstmt = newString(dbbyte1,”iso-8859-1”);
_stmt = _con.createStatement();
_stmt.executeUpdate(sqlstmt);
……

问题:如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时(称为 A 情况),上述程序代码可正确执行。但是如果客户机只有浏览器,而没有 JDK 和 CLASSPATH 时(称为 B 情况),则汉字无法正确转换。

我们的分析:

1.经过测试,在 A 情况下,程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下,程序启动时浏览器的 JAVA 控制台中出现如下错误信息:

Can't find resource for sun.awt.windows.awtLocalization_zh_CN

然后系统的缺省编码方式为“8859-1”。

2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用 “GBK” 或“GB2312”,则在 A 情况下程序仍然可正常运行,在 B 情况下,系统出现错误:

UnsupportedEncodingException。

3.在客户机上,把 JDK 的 CLASSES.ZIP 解压后,放在另一个目录中, CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件,另一边运行测试程序,最后发现在一千多个 CLASS 文件中,只有一个是必不可少的,该文件是:

sun.io.CharToByteDoubleByte.class。

将该文件拷到服务器端和其它的类放在一起,并在程序的开头 IMPORT 它,在 B 情况下程序仍然无法正常运行。

4.在 A 情况下,如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class ,则程序运行时测得默认编码方式为“8859-1”,否则为 “GBK” 或 “GB2312” 。

如果 JDK 的版本为1.2以上的话,在 B 情况下遇到的问题得到了很好的解决,测试的步骤同上,有兴趣的读者可以尝试一下。

Java 中文问题的根源分析及解决

在简体中文 MS Windows 98 + JDK 1.3 下,可以用 System.getProperties() 得到 Java 运行环境的一些基本属性,类 PoorChinese 可以帮助我们得到这些属性。

类 PoorChinese 的源代码:

public class PoorChinese {}

执行 java PoorChinese 后,我们会得到:

系统变量 file.encoding 的值为 GBK ,user.language 的值为 zh , user.region 的值为 CN ,这些系统变量的值决定了系统默认的编码方式是 GBK 。

在上述系统中,下面的代码将 GB2312 文件转换成 Big5 文件,它们能够帮助我们理解 Java 中汉字编码的转化:

import java.io.*;
import java.util.*;
public class gb2big5
{
static int iCharNum=0;
public static void main(String[] args) {
System.out.println("Input GB2312 file, output Big5 file.");
if (args.length!=2)
{
System.err.println("Usage: jview gb2big5 gbfile big5file");
System.exit(1);
String inputString = readInput(args[0]);
writeOutput(inputString,args[1]);
System.out.println("Number of Characters in file: "+iCharNum+".");
}
static void writeOutput(String str, String strOutFile)
{
try
{
FileOutputStream fos = new FileOutputStream(strOutFile);
Writer out = new OutputStreamWriter(fos, "Big5");
out.write(str);
out.close();
}
catch (IOException e)
{
e.printStackTrace();
e.printStackTrace();
}
}
static String readInput(String strInFile)
{
StringBuffer buffer = new StringBuffer();
try
{
FileInputStream fis = new FileInputStream(strInFile);
InputStreamReader isr = new InputStreamReader(fis, "GB2312");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1)
{
iCharNum += 1;buffer.append((char)ch);
}
in.close();
return buffer.toString();
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
}
}

编码转化的过程如下:

GB2312------------------>Unicode------------->Big5

执行 java gb2big5 gb.txt big5.txt ,如果 gb.txt 的内容是“今天星期三”,则得到的文件 big5.txt 中的字符能够正确显示;而如果 gb.txt 的内容是“情人节快乐”,则得到的文件 big5.txt 中对应于“节”和“乐”的字符都是符号“?”(0x3F),可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好。

正如上例一样, Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的,所以在这些基本类发布之前,没有经过严格的测试,所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久,我的一位技术上的朋友发信给我说,他终于找到了 Java Servlet 中文问题的根源。两周以来,他一直为 Java Servlet 的中文问题所困扰,因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果(这好象是大家公认的唯一的解决办法)。

后来,他确实不想如此继续安分下去了,因为这样的事情确实不应该是高级程序员所要做的工作,他就找出 Servlet 解码的源代码进行分析,因为他怀疑问题就出在解码这部分。经过四个小时的奋斗,他终于找到了问题的根源所在。原来他的怀疑是正确的, Servlet 的解码部分完全没有考虑双字节,直接把 %XX 当作一个字符。(原来 Java Soft 也会犯这幺低级的错误!)

如果你对这个问题有兴趣或者遇到了同样的烦恼的话,你可以按照他的步骤 对Servlet.jar 进行修改:

找到源代码 HttpUtils 中的 static private String parseName ,在返回前将 sb(StringBuffer) 复制成 byte bs[] ,然后 return new String(bs,”GB2312”)。作上述修改后就需要自己解码了:

HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者

form=HttpUtils.parsePostData(……)

千万别忘了编译后放到 Servlet.jar 里面。

关于 Java 中文问题的总结

Java 编程语言成长于网络世界,这就要求 Java 对多国字符有很好的支持。 Java 编程语言适应了计算的网络化的需求,为它能够在网络世界迅速成长奠定了坚实的基础。 Java 的缔造者 (Java Soft) 已经考虑到 Java 编程语言对多国字符的支持,只是现在的解决方案有很多缺陷在里面,需要我们付诸一些补偿性的措施。而世界标准化组织也在努力把人类所有的文字统一在一种编 码之中,其中一种方案是 ISO10646 ,它用四个字节来表示一个字符。当然,在这种方案未被采用之前,还是希望 Java Soft 能够严格地测试它的产品,为用户带来更多的方便。

附一个用于从数据库和网络中取出 中文乱码的处理函数,入参是有问题的字符串,出参是问题已经解决了的字符串。

posted @ 2009-06-01 18:49 drecry 阅读(134) | 评论 (0)编辑 收藏

初学者使用的vi的命令

1、vi的基本概念
 基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

1) 命令行模式command mode)

 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

2) 插入模式(Insert mode)

  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

3) 底行模式(last line mode)

  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。

不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

2、vi的基本操作
a) 进入vi

  在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:

   $ vi myfile


 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!

b) 切换至插入模式(Insert mode)编辑文件

  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

c) Insert 的切换

 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

d) 退出vi及保存文件

  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

: w filename (输入 「w filename」将文章以指定的文件名filename保存)

: wq (输入「wq」,存盘并退出vi)

: q! (输入q!, 不存盘强制退出vi)


3、命令行模式(command mode)功能键
1). 插入模式

  按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;

  按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

  按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

2). 从插入模式切换为命令行模式

  按「ESC」键。

3). 移动光标

  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。

  按「ctrl」+「b」:屏幕往“后”移动一页。

  按「ctrl」+「f」:屏幕往“前”移动一页。

  按「ctrl」+「u」:屏幕往“后”移动半页。

  按「ctrl」+「d」:屏幕往“前”移动半页。

  按数字「0」:移到文章的开头。

  按「G」:移动到文章的最后。

  按「$」:移动到光标所在行的“行尾”。

  按「^」:移动到光标所在行的“行首”

  按「w」:光标跳到下个字的开头

  按「e」:光标跳到下个字的字尾

  按「b」:光标回到上个字的开头

  按「#l」:光标移到该行的第#个位置,如:5l,56l。

4). 删除文字

  「x」:每按一次,删除光标所在位置的“后面”一个字符。

  「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。

  「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。

  「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。

  「dd」:删除光标所在行。

  「#dd」:从光标所在行开始删除#行

5). 复制

  「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

  「#yw」:复制#个字到缓冲区

  「yy」:复制光标所在行到缓冲区。

  「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

  「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

6). 替换

  「r」:替换光标所在处的字符。

  「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

7). 回复上一次操作

  「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

8). 更改

  「cw」:更改光标所在处的字到字尾处

  「c#w」:例如,「c3w」表示更改3个字

9). 跳至指定的行

  「ctrl」+「g」列出光标所在行的行号。

  「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

4、Last line mode下命令简介
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

A) 列出行号

 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

B) 跳到文件中的某一行

 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

C) 查找字符

 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

D) 保存文件

 「w」:在冒号输入字母「w」就可以将文件保存起来。

E) 离开vi

 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。

 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

5、vi命令列表
1、下表列出命令模式下的一些键的功能:

h
左移光标一个字符

l
右移光标一个字符

k
光标上移一行

j
光标下移一行

^
光标移动至行首

0
数字“0”,光标移至文章的开头

G
光标移至文章的最后

$
光标移动至行尾

Ctrl+f
向前翻屏

Ctrl+b
向后翻屏

Ctrl+d
向前翻半屏

Ctrl+u
向后翻半屏

i
在光标位置前插入字符

a
在光标所在位置的后一个字符开始增加

o
插入新的一行,从行首开始输入

ESC
从输入状态退至命令状态

x
删除光标后面的字符

#x
删除光标后的#个字符

X
(大写X),删除光标前面的字符

#X
删除光标前面的#个字符

dd
删除光标所在的行

#dd
删除从光标所在行数的#行

yw
复制光标所在位置的一个字

#yw
复制光标所在位置的#个字

yy
复制光标所在位置的一行

#yy
复制从光标所在行数的#行

p
粘贴

u
取消操作

cw
更改光标所在位置的一个字

#cw
更改光标所在位置的#个字


2、下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename

wq filename
储存正在编辑的文件为filename,并退出vi

q!
放弃所有修改,退出vi

set nu
显示行号

/或?
查找,在/后输入要查找的内容

n
与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。


对于第一次用vi,有几点注意要提醒一下:
1、用vi打开文件,是处于「命令行模式(command


posted @ 2009-05-02 10:51 drecry 阅读(127) | 评论 (0)编辑 收藏

几种乱码问题(转)

用什么编辑器可以使xml文件的中文变成UTF-8乱码   
我把g b2312改成UTF-8浏览器提示出错~~~

最简单的Word应该可以完成转换,另外UE和Edit++都支持转换

=======================================================

在写一个东东,是sqlserver后台,用utf-8编码,一直是刚出来还可,一刷新就成乱码了,以为是sql的原因,一次 把<title></title>里的全删了,就没问题了,后来发现,最好把<META http-equiv=Content-Type content="textHtml; charset=utf-8">放在title前,不然有些还是会错!
=======================================================

为每个jsp页面设置了其编码格式(utf-8),但传递数据到另一页面时依然显示为乱码?  首先要需要了解的是web容器默认编码是iso- 8859-1,一个汉字占用两个字节,而在utf-8中一个汉字占用三个字节。所以在数据传递过程中,必须手动设定容器编码格式,否则会出现字符位丢失的 情况。即3个字节变为两个字节,自然会变成乱码。为什么保存到数据库中的数据都变成了乱码?  原理同上,首先要搞清楚使用的数据库默认的编码格式,比如 mysql默认的字符编码是ISO-8859-1。所以必须手动修改其默认编码格式。  清楚了以上问题后,再来看如何解决utf-8的乱码问题。
1:设置web容器的编码格式。为你的servlet的doGet或doPost方法开始处加入如下代码:request.setCharacterEncoding("utf-8");
   response.setCharacterEncoding("utf-8");

2:为每个jsp页面指定其编码格式。<%@ page pageEncoding="utf-8"%>

3:在连接数据库用的URL后加入:useUnicode=true;characterEncoding=utf-8 如:  url="jdbc:mysql:///db1?useUnicode=true;characterEncoding=utf-8",

4:为指定数据库默认编码格式。在C:\WINDOWS目录下找到my.ini文件,并在[mysqld]中加入default-character- set=gbk,重新启动mysql服务。  至此,乱码问题全部解决。起初总搞上去不清,为什么要将mysql的默认编码格式设置为gbk,后来由相关 的资料得知utf-8默认输入编码方式为gbk,默认输出编码方式为utf-16be。  个人认为,将数据进行utf-8进行编码的目的(即将中文编码 为%的形式),主要是为了在多层服务间进行数据传输时,防止发生字符丢失(如msn)。普通的web程序显然没有必要这样做,只要使用以上方法进行处理, 就可以有效的解决乱码问题,从而结省存储空间。如果都像公司的SC系统那样,将一个汉字编码为18个字符后,再存储到数据库中,抛开效率不说,就存储空间 的浪费就够人受的,要知道,那是需要银子地!
========================================================

ASP动态网页下UTF-8页面乱码的解决方法

为什么在ASP里指定了codepage为65001还经常显示乱码。才子在这里将这个问题详细解释一下,以免很多朋友再走弯路,甚至排斥UTF-8。


如果你还不知道UTF-8是什么东东,那才子建议你先去搜索一下UTF-8的相关资料吧。


UTF-8编码之所以被越来越多的人接受甚至喜欢,肯定是有道理的,在WEB2.0盛行的今天,在大谈多浏览器兼容的同时,不得不想到字符编码不同所造成的乱码现象同样需要得到很好的处理..... CHINAZ

在N年以前,IE6以下的所有版本,只要没有安装相应的字库,访问相关的页面都是会乱码的,例如,我是IE5 (Windows2000默认) 的版本,在没有安装IE繁体字库的情况下,访问任何繁体页面的网站都是会乱码的,当然前提是该页面采用了BIG5的Charset,而UTF-8作为一种 国际编码就能很好的处理该问题,只要将页面存为UTF-8编码格式,再在页面上将codepage及charset全部定义为utf-8就可以在任何客户 端浏览器中显示出完全正确的内容,完全不会乱码......


好了,这里以ASP页面为例,以一个实例来看具体操作吧:

打开新建一个ASP页面,相信玩ASP的朋友都会留意到,许多下载的源码里,页面最上方一般都有一句:


以下为引用的内容:

%@LANGUAGE="VBSCRIPT" CODEPAGE="936"% CHINAZ
 
CHINAZ

前面的language应该不用多说了,vbscript就是ASP默认的脚本语言,其实完全可以不用写,写了好像还会影响页面执行效率,在这里我 们先不讨论这个问题。后面的codepage就是关键了,目的就是告诉浏览器,此页面是何种编码,936代表是简体中文,而950代表繁体中 文,65001就是我们今天说的UTF-8编码了。我们将936改成65001。整句如下: CHINAZ

以下为引用的内容:

%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%
 

再加上输出几个中文字看看能不能正确显示吧。 CHINAZ

以下为引用的内容:
<%
Response.Write "第一次测试UTF-8页面"
%> 

OK,直接点击“保存”,执行这个页面看看,如果不出意外,大家可能看到显示出的是 “一尾UTF-8页”这几个字,中文有乱码的现象,什么原因呢?

OK,请大家再点击最上面的 "文件" 菜单,选择"另存为",最下面一行有个编码,默认应该是ANSI的,请大家点下拉框,选择UTF-8,再点保存,再执行试试看,如果不出意外,乱得更厉害 了,呵呵,晕了吧。别急,想想原因,因为我们做的页面是HTML返回的,以前我们写HTML时,看到body前面,也就是head里都有一句meta,应 该是这样的: 

以下为引用的内容:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 

也就是指定页面以gb2312编码返回结果,一定要写在有返回结果输出的前面。大家都知道gb2312是简体中文吧,我们今天说的是UTF-8编码,我们就将gb2312改成UTF-8吧,全部代码如下: CHINAZ

以下为引用的内容:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<%
Response.Write "第一次测试UTF-8页面"
%> 

一,文件没有存为对应的格式,

可能有网友认为将META元标记的解码方式改一下,就可以实现GB2312转UTF-8,或者UTF-8转GB2312,这其实是错误的,虽然你把 GB2312编码的网页的Meta标记改为了Utf-8,但这样的操作会让你发现网页出现了乱码。究其原因你文件编码格式还是gb2312的,这时你应把 文件存为utf-8,再改meta标记的解码方式。对于将文件存为utf-8,很多朋友可能会用记事本去操作,我不建议这样去做,因为用记事本转换的编码 而做的网页会在W3C效验时出现BOM错误,具体如下

Byte-Order Mark found in UTF-8 File. The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.

你可以用比较新版本的editplus和ultraedit都可以选择保存为无BOM的utf-8格式。

二,文件缺少必要的标识

检查Html标记里有没有如下

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

检查XML文档里有没有

<?xml version="1.0" encoding="utf-8"?>

utf-8或者gb2312,看你文档的编码。

如果是ASP动态页面,最好加上以下几句

以下为相关html文档

 <%@ LANGUAGE = "VBScript" CodePage = "65001"%>

CodePage = "65001"中的65001代表是UTF-8编码的文档,GB2312编码的是936

以下为相关vbscript文档

 Session.CodePage=65001

另外网上还有如下的ASP代码,我没试过

以下为相关vbscript文档

 Response.Charset="utf-8"



结论:采用UTF-8编码,除了要将文件另存为UTF-8格式之外,还需要同时指定codepage及charset。

posted @ 2009-05-01 18:12 drecry 阅读(495) | 评论 (0)编辑 收藏

Meta的http-equiv属性详解

http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。

           meat标签的http-equiv属性语法格式是:<meta http-equiv="参数" content="参数变量值"> ;其中http-equiv属性主要有以下几种参数:

           1、Expires(期限)

           说明:可以用于设定网页的到期时间。一旦网页过期,必须到服务器上重新传输。

           用法:<meta http-equiv="expires" content="Wed, 20 Jun 2007 22:33:00 GMT">

           注意:必须使用GMT的时间格式。

           2、Pragma(cache模式)

           说明:禁止浏览器颖镜丶扑慊 幕捍嬷蟹梦室趁婺谌荨?br>
           用法:<meta http-equiv="Pragma" content="no-cache">

           注意:这样设定,访问者将无法脱机浏览。

           3、Refresh(刷新)

           说明:自动刷新并指向新页面。

           用法:<meta http-equiv="Refresh" content="2;URL=http://www.net.cn/">

          注意:其中的2是指停留2秒钟后自动刷新到URL网址。

           4、Set-Cookie(cookie设定)

          说明:如果网页过期,那么存盘的cookie将被删除。

           用法:<meta http-equiv="Set-Cookie" content="cookievalue=xxx; expires=Wednesday, 20-Jun-2007 22:33:00 GMT; path=/">

           注意:必须使用GMT的时间格式。

           5、Window-target(显示窗口的设定)

           说明:强制页面在当前窗口以独立页面显示。

           用法:<meta http-equiv="Window-target" content="_top">

           注意:用来防止别人在框架里调用自己的页面。

           6、content-Type(显示字符集的设定)

           说明:设定页面使用的字符集。

           用法:<meta http-equiv="content-Type" content="text/html; charset=gb2312">

          7、Pics-label(网页等级评定)

           用法:<meta http-equiv="Pics-label" contect="">网页等级评定

           说明:在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的。

          还有Page_Enter、Page_Exit……


补充:

设定进入页面时的特殊效果<meta    http-equiv="Page-Enter"    contect="revealTrans(duration=1.0,transtion=    12)">  
设定离开页面时的特殊效果<meta    http-equiv="Page-Exit"    contect="revealTrans(duration=1.0,transtion=    12)">  

Duration的值为网页动态过渡的时间,单位为秒。  
Transition是过渡方式,它的值为0到23,分别对应24种过渡方式。如下表:  
0    盒状收缩    1    盒状放射  
2    圆形收缩    3    圆形放射  
4    由下往上    5    由上往下  
6    从左至右    7    从右至左  
8    垂直百叶窗    9    水平百叶窗  
10    水平格状百叶窗    11垂直格状百叶窗  
12    随意溶解    13从左右两端向中间展开  
14从中间向左右两端展开    15从上下两端向中间展开  
16从中间向上下两端展开    17    从右上角向左下角展开  
18    从右下角向左上角展开    19    从左上角向右下角展开  
20    从左下角向右上角展开    21    水平线状展开  
22    垂直线状展开    23    随机产生一种过渡方式  

posted @ 2009-04-29 11:00 drecry 阅读(235) | 评论 (1)编辑 收藏

VE 安装

         这几天因为学习到了基于AWT的java 软件程序设计,所以再用eclipse 的过程中遇到了问题,没有找到那些可视化组件,找了一段时间,才知道,原来安装VE 不是象其他的软件一样,单击就可以完成。存在了这样那样的问题,呵呵,真是的,再好用的软件也有麻烦的时候啊,不过在安装的过程中自己也学习到了很多的东西呢!
         书上说要下载一个叫做VE—runtime  的东西,没事简单的很呢,只要登陆到这个网站(http://www.eclipse.org/downloads/,在右边的小框里可以看见)就可以轻松的完成这项工作,自己也觉得没什么的,不就下载一个软件嘛,呵呵!你觉的呢?
         书上又说了,你要按照以下的方法做,将VE—runtime 解压到和JDK,EMF,GMF的一个文件里,如果在对VE—runtime解压过程中出现了“文件覆盖”对话框,就选择“全部为否”按钮予以关闭,然后找configuration子文件夹,删除除了“config配置设置”以外的所有文件。
         大功告成,呵呵,书啊,就是好东西,它叫你学到了很多的东西呢!可是,呵呵!可是,结果是我失败了,palette中没有那些书上说的组件!找啊,有错就找,网上的资源多的很呢!过程和其它的就不说了,只说找的结论,以及一定能让你安装好这个软件的方法!
          结论是:VE 只有和其相应版本的EMF,eclipse-SDK,GMF工作,而JDK的要求是要在1.4.2以及以上的版本。干吗要配套使用呢,更高版本的不行嘛,不是更好嘛,想了很久还是不知道,也没有找过,要是有人找到了,请告诉我一声啊,谢谢了!还有一个结论就是:不要总是相信书上的东西,它也是有错的时候!
         下面说一下安装的具体过程:
          (1)要在以下的网址上下载我们需要的东西(EMF,GMF,VE,eclipse-SDK)http://download.eclipse.org/tools/ve/downloads/drops/R-1.2.3_jem-200701301117/index.html(注意!一定看清其版本)我们下的这几个的版本分别是:
   Eclipse build eclipse-SDK-3.2,EMF build 2.2.0,GEF Build 3.2,VE-runtime-1.2.3如果这一步错了,下面的工作就不要进行了!
  (2)将 Eclipse build eclipse-SDK-3.2直接解压到某个磁盘中,(如D:盘)这时在D盘根目录就出现了一个叫eclipse的文件夹,(注意不要先建一个eclipse文件夹,在将Eclipse build eclipse-SDK-3.2解压到这个文件夹中,这样会出现两个eclipse文件夹)打开它有许多的文件,不要管它!
        (3)在eclipse 文件夹中建立以如下几个文件EMF,GEF,VEruntime,VESDK然后将 Eclipse build eclipse-SDK-3.2解压到VESDK中,将EMF build 2.2.0解压到EMF中,将GEF Build 3.2解压GEF中,将VE-runtime-1.2.3解压到VEruntime中,呵呵!,不要烦啊,这样做的好处就是能让你一次安装完成!
  (4)在eclipse中建立一个名为links的文件夹,在其中分别建立如下的文本文件:(可以先将其建为.txt格式的,写完内容后,重命名为.link)
   EMF.link           内容为:path=D://eclipse//EMF
      GEF.link            内容为:path=D://eclipse//GEF
            VEruntime.link   内容为:path=D://eclipse//VEruntime
            VESDK.link      内容为:path=D://eclipse//VESDK
        好了,做到现在启动eclipse,在新建类快捷键中出现了visible class ,在看看palette中是不是出现了需要的可视化组件!如果出现了,祝贺你成功了,如果没有出现,请在安装一遍,不要恢心,好好看看上边的过程,你一定会成功的,并体会到java 中可视化的乐趣!
     
        

posted @ 2008-11-20 09:10 drecry 阅读(493) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2