下午開發新改的代碼在print路徑時出現上述問題,如下:
Traceback (most recent call last): File "./update.py", line 606, in <module> replace_exec_script() File "./update.py", line 550, in replace_exec_script print(file_path.encode('gbk').decode('utf-8')) UnicodeEncodeError: 'gbk' codec can't encode character '\udcd6' in position 49: illegal multibyte sequence
網上搜了半天沒找到解決方案。唯一解釋到位的就是https://blog.csdn.net/lilongsy/article/details/80724799,其他都是不對號瞎扯,路徑中有中文是個明確的需求,不是偽需求。
最后琢磨着這個\udcd6,以及“默認情況下,Python假定所有文件名都已經根據 sys.getfilesystemencoding() 的值編碼過了。 但是,有一些文件系統並沒有強制要求這樣做,因此允許創建文件名沒有正確編碼的文件。 這種情況不太常見,但是總會有些用戶冒險這樣做或者是無意之中這樣做了( 可能是在一個有缺陷的代碼中給 open() 函數傳遞了一個不合規范的文件名)。”,猜測這不是python的鍋,估計linux下顯示就是亂碼的,果不其然,如下:
[root@oel-12c 201809]# find ./app/20180108Build/scripts/ -name "*.sql"
./app/20180108Build/scripts/conf/000005-????/TA000005_????1.sql
./app/20180108Build/scripts/conf/bo-????/12.sql
將其該文中文后,問題就解決了。那這個????文件名是如何生成的呢?原來是通過xftp上傳的,上傳時沒有指定連接使用UTF-8編碼,所以就亂碼了。勾上UTF-8編碼,問題解決了。