这个小插曲不仅激发了我的好奇心,也促使我深入探究和解析其背后的原因。在本文中,我将与大家分享我对这个问题的研究过程、发现的原因以及解决方法。这个经历提醒我们,在日常工作中,一些看似简单的操作也可能隐藏着意想不到的bug,值得我们深入探讨和理解。
情景再现的起因是需要使用kingfisher下载一个数据集,代码直接从微信中检索了相关代码。

直接复制粘贴后,运行时报错信息如下。仔细检查了代码,没有发现问题,这就很奇怪了。

既然报错显示命令不存在,而软件和代码看起来没有问题,那很可能是shell字符识别的问题。因为微信复制粘贴可能会引入一些奇怪的字符。有了这个思路,接下来就是验证猜想。
验证猜想在shell中查看,在shell环境下检查我们复制粘贴了什么奇怪的东西。

可以看到确实有一些奇怪的字符。这些字符出现在从微信或其他应用程序复制的文本中,是因为原始文本含有特定的控制字符或特殊的空格字符(如非断空格U+00A0,在shell环境中显示为M-BM-,通常不可见),这些在复制过程中没有被正确处理或转换。
在文本编辑器中查看。

在Sublime Text中也可以看到一些隐藏字符,而且和在shell环境中显示的还不一样。
问题原因:\xa0是非断空格(non-breaking space)的ASCII表示,通常用于Web页面和文本处理中以防止自动换行。在十六进制中,它的表示是0xA0,属于扩展ASCII码的一部分。当从微信这样的应用中复制文本时,可能会无意中复制了这种空白字符,因为它们在微信中可能用于格式化文本,但在代码编辑器或命令行环境中通常是不可见的。所以就会出现命令看起来正确,但却运行不了的情况。
解决办法有很多,可以在shell中替换特殊字符,或者在文本编辑器中使用查找和替换功能,将所有\xa0实例替换为常规空格(ASCII码为0x20),或者直接删除它们。不同的编辑器和IDE具有不同的方法来显示和处理这些非打印字符。
在shell中替换代码如下:
echo "kingfisher get -p PRJNA289185 -m ena-ascp ena-ftp prefetch aws-http" |sed 's/M-BM-//g'

在文本编辑器中替换,打开查找面板:在Sublime Text中,按下 Ctrl + F (在Mac上是 Cmd + F)打开查找面板。开启正则表达式搜索:点击查找面板左下角的.*按钮,这样你就可以使用正则表达式来查找字符。输入要查找的正则表达式:在查找输入框中输入 \xa0 这代表非断空格。替换所有 Replace All。

替换后的效果如下:

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号