Этот символ - ㎜ - вызывает ошибку UnicodeEncodeError

Я использую скрипт Python для преобразования файлов из gb2312 в utf-8, Этот персонаж портит все: (это один символ, а не "мм").

text = '㎜'
text.encode(encoding='gb2312')

поднимает эту ошибку:

UnicodeEncodeError: кодек "gb2312" не может кодировать символ "\u040b" в позиции 1: недопустимая многобайтовая последовательность

Я могу использовать обходной путь text.replace('㎜', 'mm'), Но что, если есть другие такие персонажи? Что с этим не так? Почему это так особенное?

Есть ли способ заставить Python обращаться с ним как с любым другим персонажем?

1 ответ

Решение

Ок, я скачал файл 1.php и запустил ваш оригинальный скрипт на нем, и я получаю другое сообщение об ошибке:

UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 99-100:
  illegal multibyte sequence

Байты в файле со смещением 99 и 100 равны A9 4C в этом порядке. Это не является ни действительной GB2312, ни действительной кодировкой UTF-8 чего-либо. Я подозреваю, что у вас может быть целая куча файлов, предположительно GB2312, но на самом деле в другой кодировке. Если вам нужно просто разобраться со всеми такими проблемами, вы можете использовать errors='replace' а также mode='rU' (последнее заставляет Python понимать ваши новые строки в DOS).

file_old=open('1.php', mode='rU', encoding='gb2312', errors='replace')

Это будет вставить U+FFFD REPLACEMENT CHARACTER вместо всего, что не может расшифровать, и продолжить. Это уничтожает данные; Сначала попытайтесь выяснить, какова реальная кодировка файла.

Кстати, не забудьте исправить свой HTML-заголовок, когда вы закончите; предпочтительная форма в настоящее время

<!doctype html>
<html><head>
  <meta charset="utf-8">

Краткий, совместимый со стандартами и протестированный для работы вплоть до IE6.

РЕДАКТИРОВАТЬ: При дальнейшем исследовании, GB2312 является набор символов, а не кодировка. Существует несколько возможных его кодировок, но только одна допускает двухбайтовую последовательность A9 4C: в Big5 она соответствует символу , (Я не знаю ни одного из языков, которые используют китайские символы; имеет ли это больше смысла в контексте, чем ?)

Python и iconv Предположим, что GB2312 кодируется в другом формате, EUC-CN, если специально не указано иное. Если я изменю ваш скрипт, чтобы прочитать

file_old=open('1.php', mode='rU', encoding='big5', errors='strict')
file_new=open('2.php', mode='w', encoding='utf-8')
file_new.write(file_old.read())

затем он выполняется без ошибок на 1.php Вы предоставили.

РЕДАКТИРОВАТЬ 2: На дальнейшее дальнейшее исследование, что веб-браузеры делают с <meta charset="gb2312"> это притворяться, что вы написали <meta charset="gbk">, GBK - это расширенный набор GB2312, который включает персонаж. Python, однако, рассматривает GB2312 в соответствии с его первоначальным определением. Так что вы действительно хотите, чтобы ваше преобразование соответствовало исходному файлу

file_old=open('1.php', mode='rU', encoding='gbk', errors='strict')
Другие вопросы по тегам