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

article/2025/9/21 2:23:16

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.编译运行即可


http://chatgpt.dhexx.cn/article/LBbbacq3.shtml

相关文章

pscp上传文件至服务器

一、在pscp的目录下打开cmd 二、 输入命令格式如下 1.pscp 要上传的文件路径 服务器用户名服务器IP地址&#xff1a;要存放在服务器的地址 eg: pscp E:\Projects\mccb root8.126.174.139:lxiao 2.pscp -r 要上传的文件夹路径 服务器用户名服务器IP地址&#xff1a;要存放在服务…

用pscp进行文件传输

一、注意 1.首先说明一下&#xff0c;pscp和psftp命令用于Windows系统向Linux系统传输。scp和psftp用于Linux系统传输 2.把下载好的putty.exe和pscp.exe放在系统环境变量C:\Windwos\system32下面&#xff0c;我们使用cmd就可以在任何路径下直接使用putty和pscp了。 如果不这…

pscp详解

在linux中&#xff0c;我们常用scp命令传输文件&#xff1a; 如以下实例&#xff0c;我们想把当前服务器文件abc.sql传输到192.168.1.1服务器上&#xff0c;我们可以执行以下命令&#xff1a; Xml代码 scp /home/person/hww/abc.sql root192.168.1.1:/home/person/hww 回车…

PSCP~

PSCP 深度架构 AttnPacker——大幅优化的AI算法。 蛋白质结构和功能的形成&#xff0c;很大程度上取决于侧链原子间的相互作用&#xff0c;因此&#xff0c;精准的蛋白质侧链预测&#xff08;PSCP&#xff09;是解决蛋白质结构预测和蛋白质设计难题的关键一环。但此前蛋白质结…

pscp上传下载文件

由于很多事情经常忘记&#xff0c;所以将其记录在博客上&#xff0c;写的比较简洁&#xff0c;若能帮到大家更好 1.win10搜索pscp >打开文件夹所在位置>空白处shit右键&#xff0c;打开powershell命令窗&#xff1b; 2.上传电脑文件到服务器如下&#xff1a; 3.下载服务…

pscp 传输文件

在执行的时候要打开 putty 并连接服务器&#xff0c;否则可能报错的。 上传文件 到 Linux 服务器 pscp.exe file root192.168.32.50:/root/ 将Linux服务器上的文件夹以及文件 下载到本地 pscp -r root182.254.247.191:/usr/lib/locale "c:\locale" 命令的使用方法 Pu…

pscp linux,windows下 pscp 安装及使用

pscp简要说明 pscp为window与Linux之间的文件传输工具&#xff0c;使用和Linux下scp命令相似。 pscp 安装 下载pscp 放到C:\WINDOWS\system32中&#xff0c;然后就可以在任何地方调用 image.png 远程传输到本地 pscp [options] [user]host:source target user:远程主机的用户名…

pscp无密传数据

pscp 是 PuTTY 带的工具&#xff0c;可用作 Windows 上的 scp 替代&#xff0c;就在 PuTTY 的安装目录&#xff0c;加入 PATH 就可以敲命令用。 无密上传/下载数据需要将公钥写入服务器&#xff0c;但是 PuTTY 用的公、私钥是 .ppk 的&#xff0c;不同于 ssh 的公、私钥&#…

PSCP 基本使用

PSCP 基本使用 问题&#xff1a; 如何免密码输入&#xff0c;传送数据 “sshpass is not recognized” on Windows" PSCP&#xff1a;是Putty的文件传输工具&#xff0c;用于两台电脑之间的文件传输 重点&#xff1a;可以在命令中添加密码&#xff0c; 不像SCP需要单独输…

使用 PSCP将文件从 Windows 计算机快速传输到 Linux计算机

导读开源的 PSCP 程序可以轻松地在 Windows 和 Linux 计算机之间传输文件和文件夹。 你是否正在寻找一种将文件从 Windows 计算机快速传输到 Linux计算机并再次传输回来的方法&#xff1f;开源的 PSCP 程序可以轻松传输文件和文件夹&#xff0c;当然它是开源的。 在 Windows 中…

PSCP工具的使用教程

PSCP&#xff1a;是Putty的文件传输工具&#xff0c;用于两台电脑之间的文件传输&#xff0c;一次只能传输一个文件&#xff0c;传输完毕后立刻终止会话。 配置好pscp工具的环境变量后&#xff0c;打开 Windows 命令行&#xff0c;输入 pscp 回车&#xff0c;可以看到该工具的…

mysql主从 动态ip_mysql主从配置(清晰的思路)

mysql主从配置。鄙人是在如下环境测试的&#xff1a; 主数据库所在的操作系统&#xff1a;win7 主数据库的版本&#xff1a;5.0 主数据库的ip地址&#xff1a;192.168.1.111 从数据库所在的操作系统&#xff1a;linux 从数据的版本&#xff1a;5.0 从数据库的ip地址&#xff1a…

Mysql主从配置步骤与各种错误

测试环境&#xff1a; 2台腾讯云服务器。CentOS 7.2 64位&#xff0c;1G&#xff0c;lnmp。 PHP:5.6&#xff1b;Mysql&#xff1a;5.5 两台干净的服务器 下面开始配置主服务器&#xff08;master&#xff09; 1.修改配置&#xff1a; log-bin mysql-bin 要打开&#xff0c;…

深入理解MySQL主从配置原理

目录 1. MySQL主从复制原理工作原理 2. 主从配置步骤1: 配置主节点2: 备份主节点数据3: 配置从节点4: 启动主从复制 3.常见问题4. 需要考虑的一些因素 MySQL主从复制是一种数据库复制技术&#xff0c;通过将一个MySQL服务器&#xff08;主节点&#xff09;上的数据同步到其他My…

MySQL主从配置教程

MySQL主从配置教程 1.首先要确保配置主从的两台服务器的数据一致&#xff0c;否则可能会导致主从配置成功但是数据不一致的现象。 2.修改两台机器的my.cnf&#xff0c;配置不同的server-id&#xff0c;修改后需要重启mysql服务。 3.在主库执行命令创建共享用户 # 注意以下所…

mysql主从配置vip地址_59.MYSQL主从配置

一、MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后&#xff0c;在A上写数据&#xff0c;另外一台B也会跟着写数据&#xff0c;两者数据实时同步的 MySQL主从是基于binlog的&#xff0c;主上须开启binlog才能进行主从。 主从过程大致有3个…

windows中MySQL主从配置【第一篇】

前言&#xff1a; windows系统配置MySQL主从复制&#xff0c;系统中需要安装两个MySQL服务。我本地用的是集成环境&#xff0c;集成环境已经有一个MySQL服务&#xff0c;那么就需要自己在单独下载安装一个MySQL服务。本篇文章就是教如何下载、安装MySQL&#xff0c;最后…

docker容器下mysql主从配置

docker容器下mysql主从配置 知道的太多所以痛苦 文章目录 docker容器下mysql主从配置前言一、安装好docker容器二、docker配置mysql主从1.拉取mysql5.72.运行mysql镜像3.配置my.cnf文件4.重启mysql主从数据库5.从数据库开启同步 总结 前言 基于docker容器安装mysql并且配置主…

Linux mysql 主从 配置

在一篇文章《离线安装mysql数据库》,讲解了离线安装mysql数据库的过程&#xff0c;本文将讲解mysql数据库的主从配置方法。mysql数据库进行主从配置后&#xff0c;可以实现数据库的备份、同时应用也可以实现读写分离&#xff0c;提高应用的并发量。 1、主从原理 从《高性能my…

docker mysql 主从配置

准备&#xff1a;一台装有docker的虚拟机或者服务器 拉取mysql镜像&#xff1a; docker pull mysql:5.6 启动两个mysql容器 master docker run -p 1006:3306 --name mysql_master -v F:/mysql/mysql_master/conf:/etc/mysql -v F:/mysql/mysql_master/logs:/logs -v F:/mys…