def read_text_file(filename):
    # type: (str) -> str
    """Return the contents of *filename*.

    Try to decode the file contents with utf-8, the preferred system encoding
    (e.g., cp1252 on some Windows machines), and latin1, in that order.
    Decoding a byte string with latin1 will never raise an error. In the worst
    case, the returned string will contain some garbage characters.

    """
    with open(filename, 'rb') as fp:
        data = fp.read()

    encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1']
    for enc in encodings:
        try:
            # https://github.com/python/mypy/issues/1174
            data = data.decode(enc)  # type: ignore
        except UnicodeDecodeError:
            continue
        break

    assert not isinstance(data, bytes)  # Latin1 should have worked.
    return data