3
$\begingroup$

When loading old files, it's possible the names aren't utf-8 compliant. Meaning Python won't be able to modify them. See: T23197

Besides using a hex editor, is there a way to fix names from very old blend files so they are utf-8 compliant?

$\endgroup$
3
$\begingroup$

It's possible to get strings in Python as bytes, which allows to re-encode them into utf-8:

Eg:

import bpy
for m in bpy.data.materials:
    name_as_bytes = m.path_resolve("name", False).as_bytes()
    name_as_utf8 = name_as_bytes.decode('utf8', 'surrogateescape')
    m.name = name_as_utf8

To run this on your entire file:

import bpy

def id_iter():
    type_iter = type(bpy.data.objects)

    for attr in dir(bpy.data):
        data_iter = getattr(bpy.data, attr, None)
        if type(data_iter) == type_iter:
            for id_data in data_iter:
                if id_data.library is None:
                    yield id_data

def wash_name(id_data)
    name_as_bytes = id_data.path_resolve("name", False).as_bytes()
    name_as_utf8 = name_as_bytes.decode('utf8', 'surrogateescape')
    id_data.name = name_as_utf8

for id_data in id_iter():
    wash_name(id_data)

Ideally loading old files will always work. In this case it's not done because its a big change for a relatively rare problem.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.