loadrunner回放乱码() 函数加载中文txt文档出现乱码

3007人阅读
今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码。于是我深入地对这一现象进行了研究。这里先简单介绍一下我的分析过程:
FTP服务器在收到List指令后,会把当前文件夹的所有项目(包括文件夹和文件的名称,大小,时间,所有者等相关信息)列举出来并返回给FTP客户端。曾经在网上看到有人说过这样一句话:&ftp 在编码问题上相当笨,笨到对编码一无所知&。确实,多数FTP服务器在返回这些名称时采用的文字编码格式为ANSI。这是一个不太好的格式,英文字符占用一个字节存储空间,非英文字符占用两个字节存储空间,长度不一致。而Qt的默认文本编码采用的UTF-16(是么?这里不太肯定,反正从实验得到的数据来看至少是这样的)。即每个字符占据两个字节的存储空间。当QFtp从FTP服务器获取到当前目录下的项目信息时,名称部分直接粗暴地一个个地拆分成了UTF-16格式,并认为这些数据就是UTF-16格式的数据。那么当然不管你如何对其进行转换,数据本身都是错的,又怎么会得到正确的中文显示呢?所以,我们需要对这些数据进行特别的整理。
今天先写到这里,做个记号。过两天会写出详细的解决办法。
项目忙完了,下面贴出解决方法。
由于编码错误,我写了两个函数用于互相转换编码。
一个是由正常编码转为QFTP上所谓的&乱码&的:QString _ToSpecialEncoding(const QString &InputStr);
另一个是由QFTP乱码转换为正常编码的:QString _FromSpecialEncoding(const QString &InputStr);
需要注意的是,使用这个函数之前,你的应用程序应该在界面上能正常显示中文。我是这样来实现的:
首先考虑到代码跨平台,而且主要在Linux平台下运行。因此特别设置了QtCreator的文件默认编码为UTF-8。
也就是说工程中的.cpp和.h文件内部字符编码格式为UTF-8。
然后在工程的main函数中,QApplication app...下一行写如下代码:
&&& QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));#ifdef Q_OS_WIN&&& QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));#else&&& QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));#endif&&& QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
注意,Windows的本地默认编码为gbk(如果你用的是中文系统),Linux本地默认编码为UTF-8。
因此要根据不同的操作系统来进行设置。Linux系统和Mac系统的默认编码都是UTF-8,因此上面的代码没有区分这两个操作系统。
转换函数实现:
&QString FTPCommunicator::_FromSpecialEncoding(const QString &InputStr)
#ifdef Q_OS_WIN
QString::fromLocal8Bit(InputStr.toLatin1());
QTextCodec *codec = QTextCodec::codecForName("gbk");
if (codec)
return codec-&toUnicode(InputStr.toLatin1());
return QString("");
QString FTPCommunicator::_ToSpecialEncoding(const QString &InputStr)
#ifdef Q_OS_WIN
return QString::fromLatin1(InputStr.toLocal8Bit());
QTextCodec *codec= QTextCodec::codecForName("gbk");
if (codec)
return QString::fromLatin1(codec-&fromUnicode(InputStr));
return QString("");
当使用QFTP的put方法上传的时候,目标文件名参数的位置使用_ToSpecialEncoding(正常编码的字符串);
当使用QFTP的get方法下载的时候,目标文件名参数位置也使用上述函数
当使用QFTP遍历到的文件作为本地文件名时须使用_FromSpecialEncoding(错误编码的字符串);
使用环境:
Windows XP SP3 + IIS 作为FTP服务器。
下载程序运行在Windows XP SP3 和 Ubuntu 10.10。两操作系统均测试通过。若使用其他FTP服务器,设置使用ASCII编码的也可通过。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:330858次
积分:4013
积分:4013
排名:第2909名
原创:52篇
转载:12篇
评论:344条
(1)(1)(3)(1)(3)(1)(1)(1)(2)(1)(1)(2)(1)(2)(1)(5)(4)(2)(1)(8)(3)(2)(1)(2)(1)(2)(1)(2)(2)(1)(2)(3)(1)(3)(2)(1)(1)1830人阅读
&如果用jQuery load方法加载的文档中包含中文字符,可能会引起乱码问题。要解决这个问题,&方法1:所加载的文档本身应当采用UTF-8格式编码。在记事本中,默认的是ANSI编码,通过另存可以更改编码格式。在DW中,通过设置首选参数,可以设置新文档使用UTF-8编码,文档本身也会改UTF-8编码。方法2:源html中的head中加入 &&&&&&& &meta http-equiv=&Content-Type& content=&text/ charset=gb2312& /&&&&& 即:&&& &head&&& &meta http-equiv=&Content-Type& content=&text/ charset=gb2312& /&& &/head&&&&&&&&&&&&&&& 同时确保目标页面如Asp.net页面中已有&%@ Page ResponseEncoding=&gb2312&& ....%&。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66407次
积分:1391
积分:1391
排名:第13562名
原创:64篇
转载:56篇
评论:11条
(1)(1)(1)(1)(3)(1)(1)(9)(1)(3)(4)(1)(6)(2)(4)(7)(1)(4)(2)(5)(1)(1)(7)(6)(4)(1)(1)(2)(3)(1)(4)(1)(3)(3)(1)(2)(11)(2)(8)PHP用fgets函数读取文件txt内容并输出 汉字显示乱码_百度知道
按默认排序
fgets取的是字节,可能当中的处理你没做好,你用file_get_contents()试试
其他类似问题
fgets的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Java中的乱码问题 - 周洋的博客
坚持其实很简单 - ITeye技术网站
博客分类:
Java中乱码问题很常见,原因也多种多样,这里做一个总结,不求全面,力求准确,如果错误欢迎指正。
1.文件页面编码导致的乱码。
每一个文件(java,js,jsp,html等)都有其本身的编码格式,文件中的代码在一种编码中显示正常,在另外一种编码下就会显示出乱码。在Eclipse中,每一个工程都会有编码格式(Text file encoding), 一般默认为GBK。而一个比较好的编程习惯是新建一个项目,优先把项目的编码设为UTF-8。这样做的原因很简单,UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。几种常见的字符集,GBK,GB2312,UTF-8之间的关系如下:GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换
有兴趣了解更多,可以参考如下链接的文章,写的很好。
2.不同字符集的字符串转换时导致的乱码。每一个String,底层实现都是用一个byte数组存储,使用不同的字符集,存储的数组长度当然就不同。如果不使用同一种字符集进行解码,就一定会出现乱码。例如如下代码:
import java.io.UnsupportedEncodingE
import java.nio.charset.C
public class TestCharset {
public static void main(String[] args) throws UnsupportedEncodingException {
String strChineseString = "中文";
String encoding = System.getProperty("file.encoding");
System.out.println("系统默认的字符集是:" + encoding);
System.out.println(strChineseString.getBytes(Charset.forName("GBK")).length);
System.out.println(strChineseString.getBytes(Charset.forName("UTF-8")).length);
System.out.println(strChineseString.getBytes().length);
输出结果为:
系统默认的字符集是:UTF-8
可以看出,使用GBK和UTF-8编码,得到的byte数组长度不一样,原因就是utf-8使用3个字节来编码中文,而GBK使用2个字节来编码中文。因为我的项目默认使用UTF-8,所以使用不加参数的getBytes()得到的数组长度和使用UTF-8编码的 字符串长度一样。关于字符集的详细知识可以参考第一部分中给出的文章地址。
JDK中关于getBytes方法的描述: getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
每一个字符串底层都有自己的编码方式。不过一旦调用getByte方法后,得到的byte数组就是使用某种特定字符集编码后的数组,不需要再做多余的转换。
当得到上面的byte数组后,就可以调用String的另外一个方法来生成需要转码的String了。测试例子如下:
import java.io.UnsupportedEncodingE
import java.nio.charset.C
public class TestCharset {
public static void main(String[] args) throws UnsupportedEncodingException {
String strChineseString = "中文";
byte[] byteGBK =
byte[] byteUTF8 =
byteGBK = strChineseString.getBytes(Charset.forName("GBK"));
byteUTF8 = strChineseString.getBytes(Charset.forName("utf-8"));
System.out.println(new String(byteGBK,"GBK"));
System.out.println(new String(byteGBK,"utf-8"));
System.out.println("**************************");
System.out.println(new String(byteUTF8,"utf-8"));
System.out.println(new String(byteUTF8,"GBK"));
输出结果为:
**************************
可以看出,使用哪种字符集编码一个String,在生成一个String的时候就必须使用相应的编码,否则就会出现乱码。简单来讲,只有满足如下公式的String转码,才不会乱码。
String strSource = "你想要转码的字符串";
String strSomeEncoding = "utf-8"; //例如utf-8
String strTarget = new String (strSource.getBytes(Charset.forName(strSomeEncoding)), strSomeEncoding);
JDK中关于getBytes方法的描述:String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
3.Socket网络传输时导致的中文乱码。使用Socket进行通讯的时候,传输有多种选择,可以使用PrintStream,也可以使用PrintWriter。传输英文还好,传输中文就可能出现乱码问题。网上的说法很多,经过实际测试,发现问题还在字节和字符的问题上面。
众所周知,Java中分为字节流和字符流,字符(char)是16bit的,字节(BYTE)是8bit的。PrintStrean是写入一串8bit的数据的。 PrintWriter是写入一串16bit的数据的。 String缺省是用UNICODE编码,是16bit的。因此用PrintWriter写入的字符串,跨平台性好一些,PrintStream的可能会出现字符集乱码。
可以这样理解上面的话,PrintStream是用来操作byte, PrintWriter是用来操作Unicode, PrintStream一次读8bit的话,如果遇到汉字(一个汉字占16bit),就可能会出现乱码。一般需要处理中文时用PrintWriter好了。
最后网站测试,使用PrintWriter没有出现乱码。代码如下:
import java.io.BufferedR
import java.io.DataOutputS
import java.io.IOE
import java.io.OutputStreamW
import java.io.PrintW
import java.net.S
public class TestSocket {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
DataOutputStream dos =
PrintWriter pw =
BufferedReader in =
String responseXml = "要传输的中文";
//..........
dos = new DataOutputStream(socket.getOutputStream());
pw = new PrintWriter(new OutputStreamWriter(dos)); //不带自动刷新的Writer
pw.println(responseXml);
pw.flush();
需要注意的方面是,需要使用PrintWriter的println而不是write方法,否则服务器端会读不到数据的。原因就是println会在输出的时候在字符串后面加一个换行符,而write不会。Println和write具体区别可以参考如下网址,里面的网友有讨论:
4.JSP中显示中文的乱码。有的时候JSP页面在显示中文的时候会有乱码,大多数情况就是字符集配置和页面编码的问题。只要保证如下的几个配置没有问题,一般就不会有乱码出现。a.JSP页面顶端添加如下语句:
&%@ page contentType="text/ charset=utf-8" language="java" errorPage="" %&
b.在HTML的head标签中添加如下语句。
&meta http-equiv="Content-Type" content="text/ charset=utf-8" /&
c.保证JSP的页面编码与上面两个的charset相同,这点我有在文章的第一点说过。
上面的字符集可以根据需要自己灵活选择,不一定非要utf-8。不过因为utf-8对各国语言,特别是中文支持较好,所以推荐使用。我就曾经遇到过滘在GB2312编码的页面无法正常显示的问题。 5.Post和Get传递中文,后台获取乱码。前台传递中文也分为Get和Post方法。
a.Get方法的情况:Get方法的时候主要是URL传递中文。如果是在js文件中,可以使用如下代码进行中文转码。
var url ="/s?industry=编码"
url = encodeURI(url);
如果是在jsp文件中,则可以使用如下语句进行转码。页面开始引入:
&%@ page import="java.net.URLEncoder" %&
需要转码的地方使用URLEncoder进行编码:
&a href="xxxxx.xx?industry=&%=URLEncoder.encode("/s?wd=编码", "UTF-8")%&"&
无论使用哪种方法,在后台获取中文的时候都要使用如下代码:
request.setCharacterEncoding("utf-8");
String industry = new String(
request.getParameter("industry ").getBytes("ISO8859-1"),"UTF-8");
【注】1.对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,为了统一,需要提交指定传输编码。2.上面代码的第二句好像和第2条中给出的公式矛盾。我也纠结了好久,最后发现ISO8859-1是一种比较老的编码,通常叫做Latin-1,属于单字节编码,正好和计算机最基础的表示单位一致,因此使用它进行转码一般也没有问题。iso-8859-1是JAVA网络传输使用的标准字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会是乱码。为了省事,建议统一使用utf-8字符集。b.POST方法的情况。 对于Post的情况就比较简单了,只需要在post的函数调用部分,制定post的header的字符集,如:
xmlHttp.open("post", url , true);
xmlHttp.setRequestHeader("Content-Type","text/ charset= utf-8");
xmlHttp.send(param);
其中param为要传递的参数。
后台部分和get方法一样,设置如下即可,注意传输和接受的字符集要统一。
没懂的话可以参考如下文章,写的挺好。
6.后台向前台传递中文乱码。在这里提供一个函数,通过这个函数来发送信息,就不会出现乱码,核心思想也是设置response流的字符集。函数代码如下:
* @Function:writeResponse
* @Description:ajax方式返回字符串
* @param str:json
* @return:true:输出成功,false:输出失败
public boolean writeResponse(String str){
boolean ret =
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(str);
pw.close();
}catch (Exception e) {
e.printStackTrace();
7.下载文件时文件名乱码。下过下载的人都知道下载的文件容易出现乱码,原因也是没有对输出流的编码格式进行限定。
附上一段代码,用来帮你完成无乱码下载。
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/charset=utf-8");
response.reset();
String header = " filename=" + picN
header = new String(header.getBytes(), "UTF-8");
response.setHeader("Content-disposition", header);
核心代码就上几句,注意第二句和第三句的reset的顺序不能搞错。reset的作用是用来清空buffer缓存的,清空请求前部的一些空白行。
以上只是做了比较简单的总结,具体乱码有的时候可能是多个情况的组合,具体问题具体分析。如果错误欢迎指正。
浏览 10755
浏览: 142537 次
来自: 杭州
我说的事技术目标
请问:1、2、3目标的完成情况怎样??
分享一下啊
感谢分享!
eclipse 版本太多
axis版本太多
这样能搞定,非常感谢

我要回帖

更多关于 loadrunner脚本乱码 的文章

 

随机推荐