pscp 项目上传中文文件乱码问题

putty工程是一个开源项目,可用于远程连接Linux 机器。其中pscp项目是其中的一个子项目,可用于加密地文件传输,类似于Linux系统中的scp命令,但在windows系统中运行pscp.exe,传输中文名字的文件到远程机器中时,远程机器的文件名会出现乱码,这是由于windows系统中使用ANSI字符编码和远程机器使用UTF-8字符编码不同导致的。

下面介绍如果修改pscp源码,使其支持中文文件的传输

1.下载putty 工程

putty工程源代码下载:https://the.earth.li/~sgtatham/putty/latest/putty-src.zip

2.用VS 打开工程putty-0.70\windows\VS2012\putty.sln

3.编译项目pscp

如果出现报错:无法找到文件“version.h”

请先修改项目属性,属性->配置属性->VC++目录,在包含目录中添加路径 $(ProjectDir)..\..\..\

4.添加两个文件,winencode.h和winencode.c 增加字符编码转换的函数

winencode.h

#ifndef PUTTY_ENCODE_H
#define PUTTY_ENCODE_H#include <Windows.h>#ifdef __cplusplus
extern "C" {
#endif/*** ansi转utf16* @srcStr     源字符串* @destLen     目标字符串长度(不是size),不包括('\0')* @return       目标字符串指针,带(L'\0')结尾*/wchar_t* ansi_2_utf16(const char* srcStr, int *destLen);/*** utf16转ansi* @srcStr     源字符串* @destLen     目标字符串长度,不包括('\0')* @return       目标字符串指针,带(L'\0')结尾*/char* utf16_2_ansi(const wchar_t* srcStr, int *destLen);char* utf16_2_utf8(const wchar_t* srcStr, int *destLen);wchar_t* utf8_2_utf16(const char* srcStr, int *destLen);char* ansi_2_utf8(const char* srcStr, int *destLen);char* utf8_2_ansi(const char* srcStr, int *destLen);#ifdef __cplusplus
}
#endif
#endif

winencode.c

#include "winencode.h"wchar_t* ansi_2_utf16(const char* srcStr, int *destLen)
{// 获取转换后长度(已经包括'\0')int len = MultiByteToWideChar(CP_ACP, 0, srcStr, -1, 0, 0);len += (len == 0);wchar_t* rst = (wchar_t*)malloc(len * 2);// 转换len = MultiByteToWideChar(CP_ACP, 0, srcStr, -1, rst, len);len += (len == 0);rst[len - 1] = '\0';if (destLen)*destLen = len - 1;return rst;}char* utf16_2_ansi(const wchar_t* srcStr, int *destLen)
{// 获取转换后长度(已经包括'\0')int len = WideCharToMultiByte(CP_ACP, 0, srcStr, -1, 0, 0, NULL, NULL);len += (len == 0);char* rst = (char*)malloc(len);// 转换len = WideCharToMultiByte(CP_ACP, 0, srcStr, -1, rst, len, NULL, NULL);len += (len == 0);rst[len - 1] = '\0';if (destLen)*destLen = len - 1;return rst;}wchar_t* utf8_2_utf16(const char* srcStr, int *destLen)
{// 获取转换后长度(已经包括'\0')int len = MultiByteToWideChar(CP_UTF8, 0, srcStr, -1, 0, 0);len += (len == 0);wchar_t* rst = (wchar_t*)malloc(len * 2);// 转换len = MultiByteToWideChar(CP_UTF8, 0, srcStr, -1, rst, len);len += (len == 0);rst[len - 1] = '\0';if (destLen)*destLen = len - 1;return rst;
}char* utf16_2_utf8(const wchar_t* srcStr, int *destLen)
{// 获取转换后长度(已经包括'\0')int len = WideCharToMultiByte(CP_UTF8, 0, srcStr, -1, 0, 0, NULL, NULL);len += (len == 0);char* rst = (char*)malloc(len);// 转换len = WideCharToMultiByte(CP_UTF8, 0, srcStr, -1, rst, len, NULL, NULL);len += (len == 0);rst[len - 1] = '\0';if (destLen)*destLen = len - 1;return rst;
}char* ansi_2_utf8(const char* srcStr, int *destLen)
{wchar_t* utf16Str = ansi_2_utf16(srcStr, 0);char* utf8Str = utf16_2_utf8(utf16Str, destLen);free(utf16Str);return utf8Str;
}char* utf8_2_ansi(const char* srcStr, int *destLen)
{wchar_t* utf16Str = utf8_2_utf16(srcStr, 0);char* ansiStr = utf16_2_ansi(utf16Str, destLen);free(utf16Str);return ansiStr;
}

5. 修改文件sftp.c
    添加头文件 #include "winencode.h"
    修改fxp_open_send()函数

/** Open a file.*/
struct sftp_request *fxp_open_send(const char *path, int type,struct fxp_attrs *attrs)
{struct sftp_request *req = sftp_alloc_request();struct sftp_packet *pktout;char * utf8_path;utf8_path = ansi_2_utf8(path, 0);pktout = sftp_pkt_init(SSH_FXP_OPEN);sftp_pkt_adduint32(pktout, req->id);sftp_pkt_addstring(pktout, utf8_path);sftp_pkt_adduint32(pktout, type);free(utf8_path);if (attrs)sftp_pkt_addattrs(pktout, *attrs);elsesftp_pkt_adduint32(pktout, 0); /* empty ATTRS structure */sftp_send(pktout);return req;
}

6.编译运行即可

pscp 项目上传中文文件乱码问题相关推荐

  1. 【CKFinder】解决上传中文名文件乱码和文件重命名的问题

    在Windows Server 2003的服务器平台上,用CKFinder上传中文文件名的文件,上传后,文件名变成了乱码,导致文件链接找不到. 上传中文名文件乱码问题 在ckfinder/config ...

  2. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  3. OSS上传txt文件乱码问题

    OSS上传txt文件乱码问题 设置文件的元信息,将文件的Content-type设置为:txt/plain;charset=utf-8就行了 public static void main(Strin ...

  4. idea向mysql上传中文信息乱码问号问题

    idea向mysql上传中文信息乱码??问题 对于这个问题我还是进行了一些尝试,我下面一一列举以下. 1.File–Setting–Editor–File Encodings 按照上面路径将编码设置为 ...

  5. secureFX上传中文文件名乱码

    文件名是中文的时候,使用secureFX上传,在FX中查看正常,在secureCRT中乱码 修改.ini文件,在secure目录/Data/Settings/Config/Sessions中,defa ...

  6. shell+ftp+中文乱码_linux系统(本例为Centos)ftp上传中文名文件乱码或者显示问号解决方法 - 老牛博客...

    本文是以centos为例 Debian系统请移步 https://xiaohost.com/1855.html 产生这个问题的最根本原因是windows系统中文采用GB2312编码,而linux采用u ...

  7. linux上搭载was应用上传中文文件,受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明...

    本文档的主要内容详细介绍的是受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明. 从was9.0开始支持的最低版本的red hat Linux系统为6.6且仅支持64位操作系统 计 ...

  8. 【SecureFx服务器无法上传文中文件】

    SecureFx服务器无法上传中文文件 问题发现 解决方案 问题发现 在一次运维切换域名印射后资源服务器上无法上传中文文件了 有问题的截图长这样: 而以前正确的长这样: 解决方案 打开全局设置 找到配 ...

  9. linux lftp下载目录,linux中使用lftp上传下载文件

    lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...

最新文章

  1. tableView下沉
  2. SpringBoot使用StringRedisTemplate操作Redis字符串
  3. SQL中常见的6个报错
  4. Python3.10 结构化模式匹配 PEP 634
  5. Leetcode 142 Linked List Cycle II
  6. mysql ddl 失败_PHP加载mysql DDL会失败
  7. Nsrp实现juniper防火墙的高可用性【HA】!
  8. django系列8.3--django中间件实现登录验证(1)
  9. 虚拟机安装SQLService启用windows功能NetFx3时出错
  10. C++向mysql批量插入数据
  11. c语言编程身高体重测量,身高体重测量系统设计.doc
  12. 生物信息学分析 | 物种间的同源基因的批量注释
  13. 恒指赵鑫:8.7恒指德指喊单记录与晚盘前瞻
  14. Unity 制作数字图片字体
  15. cnode社区vue和react渲染
  16. python进行整数计算_零基础学python_05_数字(整数+浮点数)
  17. 不定宽高,实现盒子左右垂直居中
  18. OCR-文本检测后的文字纠正
  19. Oracle应用之修改表字段类型
  20. Android adb 命令大全

热门文章

  1. 关键词词云怎么做_自媒体人必备!一键搞定高逼格词云图片
  2. 打印机安全研究(二):打印机攻击测试方法和利用工具
  3. 【Linux集群基础环境搭建】基于虚拟机的多节点Linux网络环境搭建(超详细)
  4. Web 组件代码示例
  5. 老网工: 浅谈SDN技术的部署和未来
  6. 西门子S7-1200二轴V80伺服写字案例程序运动控制 写字机自动化机械控制,高速脉冲
  7. 江苏机器人竞赛南航_关于公布2020年南航金城学院首届大学生机器人比赛暨江苏省大学生机器人大赛校内选拔赛的评审结果的通知...
  8. python中使用缩进来体现代码之间的逻辑关系_Python使用缩进来体现代码之间的逻辑关系。...
  9. 数据库实验三:创建表
  10. 软件质量保障实践合集