Этот символ - ㎜ - вызывает ошибку 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')