file_story.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY bgcolor=cyan><Font size=5>
<% String str=response.encodeURL("continueWrite.jsp");
%>
<P>选择您想续写小说的名字:<BR>
<FORM action="<%=str%>" method=post name=form>
<BR><INPUT type="radio" name="R" value="spring.txt" >美丽的故事
<BR><INPUT type="radio" name="R" value="summer.txt" >火热的夏天
<BR><INPUT type="radio" name="R" value="autumn.txt" >秋天的收获
<BR><INPUT type="radio" name="R" value="winter.txt" >冬天的大雪
<BR> <INPUT type=submit name ="g" value="提交">
</FORM>
</BODY>
</HTML>continueWrite.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("iso-8859-1");
%> <HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>title </title>
</head> <BODY bgcolor=cyan>
<P>小说已有内容:
<Font size=5 Color=Navy>
<%String str=response.encodeURL("continue.jsp");
%>
<%--获取客户提交的小说的名字--%>
<%String name=(String)request.getParameter("R");
if(name==null)
{name="";
}
byte c[]=name.getBytes("ISO-8859-1");
name=new String(c);
session.setAttribute("name",name);
File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
File f=new File(storyFileDir,name);
out.println(name);
//列出小说的内容:
FileReader in=new FileReader(f);
BufferedReader bufferin=new BufferedReader(in);
String str1=null;
while((str1=bufferin.readLine())!=null)
{
//str1 = new String(str1.getBytes("ISO8859-1"), "GBK");
byte d[]=str1.getBytes("ISO8859-1");
str1 = new String(d); out.print("<BR>"+str1);
}
bufferin.close();
in.close(); %>
</Font>
<P>请输入续写的新内容:
<Form action="<%=str%>" method=post name=form>
<TEXTAREA name="messages" ROWs="12" COLS=80 WRAP="physical">
</TEXTAREA>
<BR>
<INPUT type="submit" value="提交信息" name="submit">
</FORM>continue.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%@ page import ="java.util.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY> <font size=5>
<%! //声明一个需同步处理的文件:
File f=null;
String use="yes";
%>
<%--获取客户提交的小说的名字--%>
<% String name=(String)session.getAttribute("name");
byte c[]=name.getBytes("ISO-8859-1");
name=new String(c);
//获取客户续写的内容:
String content=(String)request.getParameter("messages");
if(content==null)
{content=" ";
}
%>
<%File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
f=new File(storyFileDir,name);
//把对文件的操作放入一个同步块中,并通知
//其它用户该文件正在被操作中:
if(use.startsWith("yes"))
{ synchronized(f)
{ use="beisusing";
try{
RandomAccessFile file=new RandomAccessFile(f,"rw");
file.seek(file.length()); //定位到文件的末尾。
file.writeUTF(content);
file.close();
use="yes";
out.print("<BR>"+"内容已经写入");
}
catch(IOException e){}
}
}
//如果该小说正在被续写,就通知客户等待:
else
{out.print("该小说正在被续写,请等待");
}
%>
</BODY>
</HTML>
name=new String(name.getBytes("8859_1"),"gb2312")
或者在前面加一句:
request.setCharacterEncoding("gb2312");
response.setCharacterEncoding("gb2312");
试试
所以byte d[]=str1.getBytes("ISO8859-1")这里就错了,应该是byte d[]=str1.getBytes("GB2312"); 可以去试下,行的话不要忘了给分
但是你的方法试过不好使
我把3个文件都加了response.setCharacterEncoding("gb2312");还是乱码
你的方法也不管用
request.setCharacterEncoding("xxxx");去掉
我很少做文件操作,所以就给你说下取数据的时候乱码是怎么做,就按1楼那样,在取数据的时候进行数据格式的转换
name=new String(name.getBytes("iso-8859-1"),"gb2312");这样就可以把原本从数据库中取出来的乱码信息转换成页面的编码了,还有一个,把所有编码的大小写统一一下,区分大小写的
简单说几个lz代码的问题,其他前辈可以补充之。1. 用一个Filter来处理乱码问题吧,一个简单的如下。package com.test
import javax.servlet.*;
import java.io.*;public class FilterTest implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
;
}
@Override
public void destroy() {
;
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}然后在web.xml里部署下,步骤google下。
<filter>
<filter-name>EncodingFixed</filter-name>
<filter-class>com.test.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFixed</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 这样可以轻松的解决问题,不用每次都加上诸如:request.setCharacterEncoding("gb2312");
又是request.setCharacterEncoding("gb2312");
又是name=new String(name.getBytes("iso-8859-1"),"gb2312");
最后把自己都搞晕了。2. continue.jsp中,写文件的时候用
FileWriter fos = new FileWriter(f,true); // 可以简单方便的附加到文件最后
fos.write(content);3. 文件操作要判断文件存不存在,能读写否?等等,这些细节还是需要考虑的,否则可能异常一大堆。呵呵。
“打架就讲究个稳准狠,整那些花花架子干嘛?” --- by老白
可能您的水平太高,我还无法采用您的方法,因为您的Filter我编译不了
你的方法我试过了,还是乱码
InputStreamReader isr = new InputStreamReader(new FileInputStream(f), "GBK");
BufferedReader bufferin=new BufferedReader(isr);from: http://www.java2000.net/viewthread.jsp?tid=454
您的方法我试过了,还是乱码
ps:如果是纯文字操作,可以首选考虑Reader,Writer及其子类来操作。
答:根本原因是:你的程序中I/O的错误用法太多,不是一个方案解决得了的。如:9楼的bootupnow的过滤器几乎是字符编码的主流用法。
一言难尽,程序毛病太多。现修改如下:(已测试(Tomcat平台),一切正常。)"谢谢bootupnow !
可能您的水平太高,我还无法采用您的方法,因为您的Filter我编译不了",故代码中也没有采用过滤器。
file_story.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY bgcolor=cyan> <Font size=5>
<% String str=response.encodeURL("continueWrite.jsp");
%>
<P>选择您想续写小说的名字: <BR>
<FORM action=" <%=str%>" method=post name=form>
<BR> <INPUT type="radio" name="R" value="spring.txt" >美丽的故事
<BR> <INPUT type="radio" name="R" value="summer.txt" >火热的夏天
<BR> <INPUT type="radio" name="R" value="autumn.txt" >秋天的收获
<BR> <INPUT type="radio" name="R" value="winter.txt" >冬天的大雪
<BR> <INPUT type=submit name ="g" value="提交">
</FORM>
</BODY>
</HTML>
continueWrite.jsp<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>title </title>
</head> <BODY bgcolor=cyan>
<P>小说已有内容:
<Font size=5 Color=Navy>
<%String str=response.encodeURL("continue.jsp");
%>
<%--获取客户提交的小说的名字--%>
<%String name=(String)request.getParameter("R");
if(name==null)
{name="";
}
session.setAttribute("name",name);
File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
File f=new File(storyFileDir,name);
out.println(name);
//列出小说的内容:
FileReader in=new FileReader(f);
BufferedReader bufferin=new BufferedReader(in);
String str1=null;
while((str1=bufferin.readLine())!=null)
{ out.print(" <BR>"+str1);
}
bufferin.close();
in.close(); %>
</Font>
<P>请输入续写的新内容:
<Form action=" <%=str%>" method=post name=form>
<TEXTAREA name="messages" ROWs="12" COLS=80 WRAP="physical">
</TEXTAREA>
<BR>
<INPUT type="submit" value="提交信息" name="submit">
</FORM>
</BODY>
</HTML>continue.jsp<%@ page contentType="text/html;charset=GB2312" %>
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%@ page import ="java.util.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY> <font size=5>
<%! //声明一个需同步处理的文件:
File f=null;
String use="yes";
%>
<%--获取客户提交的小说的名字--%>
<% String name=(String)session.getAttribute("name");
name=name==null?"":name;
//获取客户续写的内容:
String content=(String)request.getParameter("messages");
if(content==null)
{content=" ";
}
%>
<%File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
f=new File(storyFileDir,name);
//把对文件的操作放入一个同步块中,并通知
//其它用户该文件正在被操作中:
if(use.startsWith("yes"))
{ synchronized(f)
{ use="beisusing";
try{
//RandomAccessFile file=new RandomAccessFile(f,"rw");
//file.seek(file.length()); //定位到文件的末尾。
//file.writeUTF(content);
//file.close();
FileWriter fw = new FileWriter(f,true);//添加方式
fw.write(content);
fw.flush();
fw.close();
use="yes";
out.print(" <BR>"+"内容已经写入");
}
catch(IOException e){}
}
}
//如果该小说正在被续写,就通知客户等待:
else
{out.print("该小说正在被续写,请等待");
}
%>
</BODY>
</HTML>
您的代码在我的环境下运行了,正常情况下文本文件内容还是乱码,如:
小说已有内容: spring.txt
锘垮ぇ瀹跺ソ 请输入续写的新内容:
如果把continueWrite.jsp 页面的IE编码改为Unicode则文本文件内容显示正常,其它汉字显示乱码,如:
С˵ґӐĚȝ?? spring.txt
大家好 ǫʤȫид?Đڈݣ?
我的JDK是1.4,TOMCAT是5.0,难道是环境不对?
lz可以新建一个文件(如:spring.txt)来试试,把原来生成的旧文件删除之。
while((str1=bufferin.readLine())!=null)
{ out.print(" <BR>"+str1);
<%@page import="java.io.*"%>
<pre>
<%
File f = new File("d:/test.txt");
InputStreamReader isr = new InputStreamReader(new FileInputStream(f), "GBK");
BufferedReader bufferin = new BufferedReader(isr);
String line = null;
while ((line = bufferin.readLine()) != null) {
out.println(line);
}
bufferin.close();
%>
</pre>
我现在就两个文件:file_story和您上面的代码文件xs.jsp,第一次运行是乱码,以后就是以下信息了:
HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception sun.io.MalformedInputException
sun.io.ByteToCharDoubleByte.flush(ByteToCharDoubleByte.java:57)
sun.nio.cs.StreamDecoder$ConverterSD.flushInto(StreamDecoder.java:266)
sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:290)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:182)
java.io.InputStreamReader.read(InputStreamReader.java:167)
java.io.BufferedReader.fill(BufferedReader.java:136)
java.io.BufferedReader.readLine(BufferedReader.java:299)
java.io.BufferedReader.readLine(BufferedReader.java:362)
org.apache.jsp.story.xs_jsp._jspService(xs_jsp.java:48)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.
--------------------------------------------------------------------------------
看来这个问题还真棘手,要不我讲课时把这个问题略过去得了
continueWrite.jsp:
下面三处改称这样:
...
request.setCharacterEncoding("gb2312");
...
byte c[]=name.getBytes("gb2312");
...
byte d[]=str1.getBytes("gb2312");continue.jsp:
下面两处这样改:
byte c[]=name.getBytes("gb2312");
file.write(content.getBytes("gb2312")); //这句最关键!!!
我测试过了,结果正确
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page1</title>
</head>
<body>
<h1>选择您想续写小说的名字: </h1><br>
<form action="continueWrite.jsp" method="post">
<input type="radio" name="filename" value="spring.txt" checked>美丽的故事<br>
<input type="radio" name="filename" value="summer.txt">火热的夏天<br>
<input type="radio" name="filename" value="autumn.txt">秋天的收获<br>
<input type="radio" name="filename" value="winter.txt">冬天的大雪<br>
路径:<input type="text" name="filepath" value="D:/story/"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>2 文件:continueWrite.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page2</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<%
String filePath = request.getParameter("filepath");
String fileName = request.getParameter("filename");
filePath = filePath.endsWith("/")?filePath:filePath + "/";
File file = new File(filePath + fileName);
session.setAttribute("file",file.getAbsoluteFile());
if(file.exists()){ // 如果文件存在,就读取之
out.println(file);
try{
BufferedReader br = new BufferedReader(new FileReader(file));
String s = "",tmp = "";
while((tmp = br.readLine()) != null){
System.out.println(tmp);
s += tmp + "<br>";
}
br.close();
%>
内容:
<br>
<div style="border:1px solid #0000FF"><%= s %></div>
<%
} catch (IOException e) {
e.printStackTrace();
return;
}
} else {
try {
if(new File(filePath).mkdirs()){
file.createNewFile(); // 建立一个新文件
}
} catch (IOException e) {
%>
<h1>IO出现了异常!<%=e.getMessage()%></h1>
<%
return;
}
}
%>
<form action="continue.jsp" method="post">
续写新内容:<br>
<textarea rows="10" cols="50" name="editarea"></textarea>
<input type="submit" name="submit" value="提交"></form>
</body>
</html>
3 文件:continue.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page3</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<%
String content = request.getParameter("editarea");
synchronized(this){
try{
String fileName = session.getAttribute("file").toString();
session.removeAttribute("file");
System.out.println(fileName);
File file = new File(fileName);
if(!file.exists())
throw new IOException("文件不存在");
BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
bw.write(content);
bw.flush();
bw.close();
%>
<h1>续写完毕</h1>
<%
}catch(IOException e){
e.printStackTrace();
%>
<h1>IO出现了异常!<%=e.getMessage()%></h1>
<%
}
}
%>
</body>
</html>
我按你说的修改后还是乱码:
小说已有内容: spring.txt
锘看蠹液?
请输入续写的新内容:
我的jdk是1.4,tomcat是5.0,是否环境有问题?
我是一位大学老师,才学java,有这么多师傅,我以后上讲台底气足多了!
我就纳了闷了:bootupnow 先生费了那么多精力,在我的机器上显示的竟是这样:
ѡ��������дС˵�����֣�
�������
���ȵ�����
������ջ�
����Ĵ�ѩ
·����
天理何在?!
我决定重新配置环境了,请问jdk和tomcat如何搭配最为合理?特别是楼上的这些朋友,你们调试正常的环境是什么,可否指点一下,本人在此鞠躬了
建议用jdk 1.5以上 配合 tomcat 5.5以上
ps:偶也是初学,共同进步之,呵呵
spring.txt如果有以前的乱码,输出还是乱码。
你的spring.txt有以前的乱码字符,先把spring.txt原有的字符清空了。
file_story.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY bgcolor=cyan> <Font size=5>
<% String str=response.encodeURL("continueWrite.jsp");
%>
<P>选择您想续写小说的名字: <BR>
<FORM action=" <%=str%>" method=post name=form>
<BR> <INPUT type="radio" name="R" value="spring.txt" >美丽的故事
<BR> <INPUT type="radio" name="R" value="summer.txt" >火热的夏天
<BR> <INPUT type="radio" name="R" value="autumn.txt" >秋天的收获
<BR> <INPUT type="radio" name="R" value="winter.txt" >冬天的大雪
<BR> <INPUT type=submit name ="g" value="提交">
</FORM>
</BODY>
</HTML>continueWrite.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>title </title>
</head> <BODY bgcolor=cyan>
<P>小说已有内容:
<Font size=5 Color=Navy>
<%String str=response.encodeURL("continue.jsp");
%>
<%--获取客户提交的小说的名字--%>
<%String name=(String)request.getParameter("R");
if(name==null)
{name="";
}
byte c[]=name.getBytes("gb2312");
name=new String(c);
session.setAttribute("name",name);
File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
File f=new File(storyFileDir,name);
out.println(name);
//列出小说的内容:
FileReader in=new FileReader(f);
BufferedReader bufferin=new BufferedReader(in);
String str1=null;
while((str1=bufferin.readLine())!=null)
{
//str1 = new String(str1.getBytes("ISO8859-1"), "GBK");
byte d[]=str1.getBytes("gb2312");
str1 = new String(d); out.print(" <BR>"+str1);
}
bufferin.close();
in.close(); %>
</Font>
<P>请输入续写的新内容:
<Form action=" <%=str%>" method=post name=form>
<TEXTAREA name="messages" ROWs="12" COLS=80 WRAP="physical">
</TEXTAREA>
<BR>
<INPUT type="submit" value="提交信息" name="submit">
</FORM>continue.jsp:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import ="java.io.*" %>
<%@ page import ="java.util.*" %>
<%
request.setCharacterEncoding("gb2312");
%> <HTML>
<BODY> <font size=5>
<%! //声明一个需同步处理的文件:
File f=null;
String use="yes";
%>
<%--获取客户提交的小说的名字--%>
<% String name=(String)session.getAttribute("name");
byte c[]=name.getBytes("gb2312");
name=new String(c);
//获取客户续写的内容:
String content=(String)request.getParameter("messages");
if(content==null)
{content=" ";
}
//byte[] content=co.getBytes("gb2312");
%>
<%File storyFileDir=new File("d:","story");
storyFileDir.mkdir();
f=new File(storyFileDir,name);
//把对文件的操作放入一个同步块中,并通知
//其它用户该文件正在被操作中:
if(use.startsWith("yes"))
{ synchronized(f)
{ use="beisusing";
try{
RandomAccessFile file=new RandomAccessFile(f,"rw");
file.seek(file.length()); //定位到文件的末尾。
file.write(content.getBytes("gb2312"));
file.close();
use="yes";
out.print(" <BR>"+"内容已经写入");
}
catch(IOException e){}
}
}
//如果该小说正在被续写,就通知客户等待:
else
{out.print("该小说正在被续写,请等待");
}
%>
</BODY>
</HTML>
zhong过好’;./'ziji人民多大;;;深入请输入续写的新内容:
我重建文本文件后好用了!
今天是什么日子啊!天这么蓝.因为下午我的课没问题了!!!
另外还要感谢bootupnow、jiangnaisong 、hmsuccess 、 java2000_net 、huangpeihp、wenzejiang、dengfeiling 、caoyinghui1986、ariksy7587195、 wenzejiang ,希望能和你们成为好朋友!