问题现象

升级过程进行备份时候报 UnicodeEncodeError:'utf-8'codec can't encode characters in position 44-47:surrogates not allowed

[ INFO ]-[x2openEuler-upgrade]-[Backup]:get backup dir and files in sut.conf
Traceback(most recent call last):
File "/usr/bin/x2openEuler-upgrade",line 9,in
mainO
File "sut/workflow/actor.py",line 329,in actor.main
File "sut/workflow/actorpy",line 161,in actorrun_backup
File "./sut/backup/_init_py",line 9,in process
File "sut/backup/actorpy",line 446,in actor.for_backup_process
File "sut/backup/actor.py",line 359,in actor.BackupFiles.do_files_backup
File "sut/backup/actorpy",line 139,in actor.BackupFiles.get_all_backup_files
File "sut/backup/actorpy",line 128,in actor.BackupFiles.get_other_files
File "sut/backup/actor.py",line 130,in actor.BackupFiles.get_other_files
File "sut/backup/actorpy",line 77,in actor.BackupFiles.write_backup_list_to_file
UnicodeEncodeError:'utf-8'codec can't encode characters in position 44-47:surrogates not allowed
ERROR ]-[centos2openEuler]:x2openEuler-upgrade backup failed,please check
2
##THE END##

alt text

分析

备份目录下有文件的文件名不能被utf-8进行转码

解决

把下面的脚本保存成一个check_utf8.py文件,执行python3 check_utf8.py, 在升级过程,有时候是没有python3,可以借助x2openEuler工具中封装的python3,比如执行/usr/local/x2openEuler-python/bin/python3 check_utf8.py

import os
import json
dirname_list = ["/boot","/root","/run","/usr","/etc"]
garbled_dict = {"result": []}
result_path = "garbled_result.txt"

def covert_to_utf8(filename):
    try:
        encode_filename = filename.encode("utf-8")
    except UnicodeEncodeError as e:
        garbled_dict.get("result").append(filename)
        print(f"错误的文件名:{str(filename).encode('utf-8','replace').decode('utf-8')}")
        return None, str(e)
    return encode_filename,None

def check_utf8_file(dirname):
    for maindir, subdir, file_name_lists in os.walk(dirname):
        try:
            covert_to_utf8(maindir)
        except Exception as e:
            print(f"err is {e}")
            print("*****{0}/{1}******".format(maindir,subdir))
            continue

        for filename in file_name_lists:
            apath = os.path.join(maindir, filename)
            try:
                utf8_filename, error = covert_to_utf8(apath)
            except Exception as e:
                print(e)
                print("{0}/{1}".format(maindir,subdir))
                continue

for dirname in dirname_list:
    check_utf8_file(dirname)

print(f"garbled_dict is {garbled_dict}")

try:
    data_str = json.dumps(garbled_dict,default=lambda obj: __dict__,indent=2)
except (TypeError,ValueError) as err:
    print(f"Dumps json file {result_path} failed, please check your raw data")
    exit(0)
try:
    with os.fdopen(os.open(result_path, os.O_WRONLY |os.O_CREAT| os.O_TRUNC, 0o660), 'w') as jsonfile:
                   jsonfile.write(data_str)
except OSError as err:
     print("Generate json file {0} failed, please check your raw data!".format(result_path))

脚本执行之后,发现/usr下面有个图标是乱的,把它移到其他目录或删除即可

results matching ""

    No results matching ""