def fix_encoding_and_explain(text):
    """
    Re-decodes text that has been decoded incorrectly, and also return a
    "plan" indicating all the steps required to fix it.

    The resulting plan could be used with :func:`ftfy.fixes.apply_plan`
    to fix additional strings that are broken in the same way.
    """
    best_version = text
    best_cost = text_cost(text)
    best_plan = []
    plan_so_far = []
    while True:
        prevtext = text
        text, plan = fix_one_step_and_explain(text)
        plan_so_far.extend(plan)
        cost = text_cost(text)
        for _, _, step_cost in plan_so_far:
            cost += step_cost

        if cost < best_cost:
            best_cost = cost
            best_version = text
            best_plan = list(plan_so_far)
        if text == prevtext:
            return best_version, best_plan
def fix_encoding_and_explain ( text ) : best_version = text best_cost = text_cost ( text ) best_plan = [ ] plan_so_far = [ ] while True : prevtext = text text , plan = fix_one_step_and_explain ( text ) plan_so_far . extend ( plan ) cost = text_cost ( text ) for _ , _ , step_cost in plan_so_far : cost += step_cost if cost < best_cost : best_cost = cost best_version = text best_plan = list ( plan_so_far ) if text == prevtext : return best_version , best_plan
Re-decodes text that has been decoded incorrectly, and also return a
    "plan" indicating all the steps required to fix it.

    The resulting plan could be used with :func:`ftfy.fixes.apply_plan`
    to fix additional strings that are broken in the same way.