`
coding1688
  • 浏览: 237563 次
  • 来自: 上海
社区版块
存档分类
最新评论

由ftp4j导致的中文乱码问题的解决方法

阅读更多

 

由ftp4j导致的中文乱码问题的解决方法

本文来自:http://www.vktone.com/articles/ftp4j_chaos.html

ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能。可以用来传输文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、改名、移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直连,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接、通过SSL安全连接等。

在本站的博客系统后台管理程序中就使用了ftp4j作为博客上传至空间的组件,但在开始使用的时候,发现将静态网页上传至空间后,用浏览器打开是乱码(惨不忍睹),要手动修改成UTF-8编码才能正常浏览,实际上所有网页是采用GBK编码的。

首页的html开头部分如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
    <title>移动互联网技术及应用 - V客小站 - V客小站</title>

使用Linux下的hexdump工具查看如下,注意黄色背景的部分:

[root@localhost blog_wwwroot]# hexdump -C index.html | head -100
00000000  3c 21 44 4f 43 54 59 50  45 20 68 74 6d 6c 20 50  |<!DOCTYPE html P|
00000010  55 42 4c 49 43 20 22 2d  2f 2f 57 33 43 2f 2f 44  |UBLIC "-//W3C//D|
00000020  54 44 20 58 48 54 4d 4c  20 31 2e 30 20 54 72 61  |TD XHTML 1.0 Tra|
00000030  6e 73 69 74 69 6f 6e 61  6c 2f 2f 45 4e 22 20 22  |nsitional//EN" "|
00000040  68 74 74 70 3a 2f 2f 77  77 77 2e 77 33 2e 6f 72  |http://www.w3.or|
00000050  67 2f 54 52 2f 78 68 74  6d 6c 31 2f 44 54 44 2f  |g/TR/xhtml1/DTD/|
00000060  78 68 74 6d 6c 31 2d 74  72 61 6e 73 69 74 69 6f  |xhtml1-transitio|
00000070  6e 61 6c 2e 64 74 64 22  3e 0a 3c 68 74 6d 6c 20  |nal.dtd">.<html |
00000080  78 6d 6c 6e 73 3d 22 68  74 74 70 3a 2f 2f 77 77  |xmlns="http://ww|
00000090  77 2e 77 33 2e 6f 72 67  2f 31 39 39 39 2f 78 68  |w.w3.org/1999/xh|
000000a0  74 6d 6c 22 20 78 6d 6c  3a 6c 61 6e 67 3d 22 7a  |tml" xml:lang="z|
000000b0  68 2d 43 4e 22 20 6c 61  6e 67 3d 22 7a 68 2d 43  |h-CN" lang="zh-C|
000000c0  4e 22 3e 0a 3c 68 65 61  64 3e 0a 09 3c 74 69 74  |N">.<head>..<tit|
000000d0  6c 65 3e d2 c6 b6 af bb  a5 c1 aa cd f8 bc bc ca  |le>.............|
000000e0  f5 bc b0 d3 a6 d3 c3 20  2d 20 56 bf cd d0 a1 d5  |....... - V.....|
000000f0  be 20 2d 20 56 bf cd d0  a1 d5 be 3c 2f 74 69 74  |. - V......</tit|
00000100  6c 65 3e 0a 09 3c 6d 65  74 61 20 68 74 74 70 2d  |le>..<meta http-|

下面是从空间下载的文件内容,其中黄色背景的部分与上面对应:(很显然,是不一样的)

[root@localhost ~]# curl -s http://www.vktone.com/ | hexdump -C index.html | head -100 00000000  3c 21 44 4f 43 54 59 50  45 20 68 74 6d 6c 20 50  |<!DOCTYPE html P| 00000010  55 42 4c 49 43 20 22 2d  2f 2f 57 33 43 2f 2f 44  |UBLIC "-//W3C//D| 00000020  54 44 20 58 48 54 4d 4c  20 31 2e 30 20 54 72 61  |TD XHTML 1.0 Tra| 00000030  6e 73 69 74 69 6f 6e 61  6c 2f 2f 45 4e 22 20 22  |nsitional//EN" "| 00000040  68 74 74 70 3a 2f 2f 77  77 77 2e 77 33 2e 6f 72  |http://www.w3.or| 00000050  67 2f 54 52 2f 78 68 74  6d 6c 31 2f 44 54 44 2f  |g/TR/xhtml1/DTD/| 00000060  78 68 74 6d 6c 31 2d 74  72 61 6e 73 69 74 69 6f  |xhtml1-transitio| 00000070  6e 61 6c 2e 64 74 64 22  3e 0a 3c 68 74 6d 6c 20  |nal.dtd">.<html | 00000080  78 6d 6c 6e 73 3d 22 68  74 74 70 3a 2f 2f 77 77  |xmlns="http://ww| 00000090  77 2e 77 33 2e 6f 72 67  2f 31 39 39 39 2f 78 68  |w.w3.org/1999/xh| 000000a0  74 6d 6c 22 20 78 6d 6c  3a 6c 61 6e 67 3d 22 7a  |tml" xml:lang="z| 000000b0  68 2d 43 4e 22 20 6c 61  6e 67 3d 22 7a 68 2d 43  |h-CN" lang="zh-C| 000000c0  4e 22 3e 0a 3c 68 65 61  64 3e 0a 09 3c 74 69 74  |N">.<head>..<tit| 000000d0  6c 65 3e e7 bb 89 e8 af  b2 e5 a7 a9 e6 b5 9c e6  |le>.............| 000000e0  8e 95 e4 bb 88 e7 bc 83  e6 88 9e e5 a6 a7 e9 8f  |................| 000000f0  88 ee 88 9a e5 bc b7 e6  90 b4 e6 97 82 e6 95 a4  |................| 00000100  20 2d 20 56 e7 80 b9 e3  88 a0 e7 9a ac e7 bb 94  | - V............| 00000110  ef bf bd 20 2d 20 56 e7  80 b9 e3 88 a0 e7 9a ac  |... - V.........| 00000120  e7 bb 94 ef bf bd 2f 74  69 74 6c 65 3e 0a 09 3c  |....../title>..<|

仔细想了一下,我本地文件的编码为GBK,而用浏览器浏览空间里的文件需要改成UTF-8编码才对,这应该是ftp4j在上传文件时进行了编码转换(或者它默认把文件当成UTF-8编码的)。为了避免ftp4j自动转换,应该采用binary方式传送,在上传之前进行设置即可。 client.setType(FTPClient.TYPE_BINARY); client.upload(filename); 下面的文字是从ftp4j的官方文档中摘录下来的,说明了ftp4j对文本和二进制传输方式的处理方式: http://www.sauronsoftware.it/projects/ftp4j/manual.php?PHPSESSID=l7o2bb276feu51v4p8cih0sq81#16 Another data transfer key concept concerns the binary and the textual types. When a transfer is binary the file is treated as a binary stream, and it is stored by the target machine as it is received from the source. A textual data transfer, instead, treats the transferred file as a character stream, performing charset transformation. Suppose your client is running on a Windows platform, while the server runs on UNIX, whose default charsets are usually different. The client send a file to the server selecting textual type. The client assumes that the file is encoded with the machine standard charset, so it decodes every character and encodes it in an intermediate charset before sending. The server receives the stream, decode the intermediate charset and encodes the file with its machine default charset before storing. Bytes has been changed, but contents are the same. You can choose your transfer type calling: client.setType(FTPClient.TYPE_TEXTUAL);
client.setType(FTPClient.TYPE_BINARY);
client.setType(FTPClient.TYPE_AUTO);

The TYPE_AUTO constant, which is also the default one, let the client pick the type automatically: a textual transfer will be performed if the extension of the file is between the ones the client recognizes as textual type markers. File extensions are sniffed through a FTPTextualExtensionRecognizer (it.sauronsoftware.ftp4j.FTPTextualExtensionRecognizer) instance. The default extension recognizer, which is an instance of it.sauronsoftware.ftp4j.recognizers.DefaultTextualExtensionRecognizer, recognizes these extensions as textual ones:

abc acgi aip asm asp c c cc cc com conf cpp
csh css cxx def el etx f f f77 f90 f90 flx
for for g h h hh hh hlb htc htm html htmls
htt htx idc jav jav java java js ksh list
log lsp lst lsx m m mar mcf p pas php pl pl
pm py rexx rt rt rtf rtx s scm scm sdml sgm
sgm sgml sgml sh shtml shtml spc ssi talk
tcl tcsh text tsv txt uil uni unis uri uris
uu uue vcs wml wmls wsc xml zsh

You can build your own recognizer implementing the FTPTextualExtensionRecognizer interface, but maybe you'll like more to instance the convenience class ParametricTextualExtensionRecognizer (it.sauronsoftware.ftp4j.recognizers.ParametricTextualExtensionRecognizer). Anyway, don't forget to plug your recognizer in the client:

client.setTextualExtensionRecognizer(myRecognizer);

本文来自:http://www.vktone.com/articles/ftp4j_chaos.html

更多精彩内容请访问:http://www.vktone.com/

 

2
2
分享到:
评论

相关推荐

    Linux系统中文乱码解决完整方案

    * 使用 Putty 代替 Secure Shell Client 可以解决中文乱码问题,但不能彻底解决问题。 * 修改 Linux 系统的默认字符集可以彻底解决中文乱码问题。 * 安装 Linux 系统时,采用默认的英文安装,而不要使用中文。 * ...

    DelphiXe8 FTP客户端程序解决中文乱码问题增加进度条功能

    总结,通过设置FTP会话的字符集、进行编码转换以及利用`TIdFTP`的事件机制,我们可以成功解决Delphi XE8 FTP客户端程序的中文乱码问题并添加进度条功能。这样,用户不仅能正确识别中文文件名,还能清楚地看到文件...

    FTP上传文件,读取文件中文字符,解决乱码问题

    FTP上传文件,FTP解决乱码问题 解决乱码讲new String(s.getBytes("gbk"),"ISO8859-1");//其转换后还是乱码 改成国际中文标准码就行了

    ftp服务器乱码解决.docx

    今天我们将讨论如何解决 FTP 服务器中的中文乱码问题,特别是使用 Serv-U 建立的 FTP 服务器。 Serv-U 是一个流行的 FTP 服务器软件,提供了丰富的功能和高性能的文件传输服务。然而,在使用 Serv-U 建立的 FTP ...

    ftp 服务器上传图片中文乱码

    综上所述,解决FTP服务器上传图片中文乱码问题需要关注FTP客户端和服务器的字符编码设置、工作模式、操作系统兼容性以及进行充分的测试和排查。通过正确配置这些参数,应该能够成功上传带有中文文件名的图片,避免...

    乱码解决 乱码解决 乱码解决 乱码解决 乱码解决

    在IT领域,乱码问题是一个常见的困扰,尤其是在处理文本数据时。...乱码问题虽然麻烦,但只要了解其产生原因,掌握解决方法,就能有效地应对。在日常工作中,保持良好的编码习惯和规范的操作流程,是预防乱码的关键。

    解决Ubuntu和Windows的文件乱码问题

    Windows系统通常使用GBK编码来处理中文,而Ubuntu系统默认使用UTF-8编码,这导致了两者在处理中文文件时出现乱码的问题。本文详细介绍了如何解决Ubuntu和Windows在处理文件时发生的乱码问题。 首先,我们需要了解...

    android的ftp4j的jar包

    6. 自动转换文件编码:FTP4J可以自动处理字符编码问题,确保文件名和内容正确显示。 7. 事件驱动:FTP4J使用监听器接口,允许开发者对FTP事件做出反应,如连接建立、文件传输完成等。 在Android项目中使用FTP4j的...

    FTP客户端Java类库 ftp4j

    1. **连接与断开**:`FtpClient`类是ftp4j的核心,通过`connect()`方法建立与FTP服务器的连接,`disconnect()`方法则断开连接。它支持主动和被动模式,以及TLS/SSL安全连接。 2. **登录与注销**:使用`login()`和`...

    ftp4j-一个开源的支持代理的FTP组件

    (不过如果你需要FTPS及SFTP,那ftp4j不支持) jar包只有50多k,地址在这里:ftp4j 使用代理的代码: import java.util.ArrayList; import it.sauronsoftware.ftp4j.FTPClient; import it.sauronsoftware.ftp4j....

    ftp4j实例+jar包+源码.rar

    FTP4J库由Sauron Software开发,版本号为1.7.2,是该库的一个稳定版本。 FTP协议是互联网上广泛使用的标准,用于在客户端和服务器之间传输文件。FTP4J库简化了这个过程,通过提供一系列的API,使得开发者无需深入...

    ftp4j.jar包

    Ftp4j.jar 包用于开发FTp应用

    ftp客户端(ftp4j修改版)

    不过,从描述来看,这个修改版应该是解决了在Android环境下使用ftp4j的一个关键问题,使得开发者可以更加安心地在Android应用中集成FTP功能。 总之,ftp4j修改版为Android开发者提供了一个更可靠的FTP客户端库,...

    Server-U出现乱码的解决方法

    "Server-U出现乱码的解决方法"这个标题所指的问题,就是当使用Server-U这款流行的FTP(文件传输协议)服务器软件时,遇到了中文文件名或目录名显示为乱码的状况。Server-U是一款功能强大的FTP服务器程序,它允许系统...

    FileZilla server中文乱码问题

    解决FTP服务器FileZilla server中文乱码问题 先前在windows2003上安装了filezilla server 0.9.27做FTP服务器,最近发现用flashfxp连接后服务器端上的中文全是乱码。 网上找了搜索一下信息,大意说是从0.9.14版之后...

    ftp4j使用方法

    ### FTP4J 使用方法详解 #### 一、简介 FTP4J是一款用于Java应用程序的FTP客户端库,可以方便地进行FTP操作,如上传文件、下载文件等。在本篇文章中,我们将详细介绍如何使用FTP4J来进行FTP操作,并通过一个具体的...

    ftp4j-1.7.2.jar

    标题中的"ftp4j-1.7.2.jar"指的是该库的一个特定版本,1.7.2,这通常意味着它包含了在此版本中修复的问题和可能的新特性。 在Java应用程序中使用FTP4J,首先需要将`ftp4j-1.7.2.jar`添加到项目的classpath中。这是...

    ftp4j 上传 下载

    - FTP4j提供中文帮助文档,对于中文用户来说,阅读和理解库的使用方法更加方便。 10. 示例项目: - 提到的“自己写的一个完整的上传实例”可能是指一个包含如何使用FTP4J进行文件上传的示例程序,这对于初学者...

    FTP服务器下载文件,用的apache的包,解决中文乱码

    FTP服务器下载文件,用的apache的包,解决中文乱码,可批量下载文件,jar包我的另外一个资源有的!

    SwiFTP、FTP4J以及Demo下载

    总的来说,SwiFTP和FTP4J为Java开发者提供了强大且灵活的FTP解决方案,无论你是新手还是经验丰富的程序员,都能从中受益,实现高效和安全的文件传输功能。通过深入研究提供的源代码和SDK,你将能够熟练地在你的应用...

Global site tag (gtag.js) - Google Analytics