[devel] python encodings
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Ноя 18 03:41:13 MSK 2007
On Sat, Nov 17, 2007 at 10:38:27AM +0300, Anton Farygin wrote:
> Мне кажется, что достаточно было бы вывести вменяемую диагностику. По
> крайней мере в моём случае.
Я сделал вменяемую диагностику, насколько это возможно.
$ hsh --init
..
rpm-build-python-0.32-alt1
...
$ hsh-shell
$$ cd
$$ echo '# coding: utf8' >test.py
$$ /usr/lib/rpm/python.req test.py
python.req: test.py: non-standard encoding: utf8
python2.4(encodings)
python.req: ERROR: test.py:
python.req: maybe you need python-modules-encodings
Traceback (most recent call last):
File "/usr/lib/rpm/python.req.py", line 178, in ?
import encodings
ImportError: No module named encodings
$$
Вообще-то MemoryError в данном случае -- это питоновский баг
http://bugs.python.org/issue979739
> > Думаю, захачить на эту тему python-base или нет. То есть чтобы он
> > понимал побольше настандартных алиасов для стандартных кодировок,
> > без заглядывания в encodings.
>
> Если нестантартные алиасы являются стандартом де-факто (т.е. -
> значительно распространены), то видимо стоит хачить питон. В обратном
> случаае - выводить вменяемую диагностику и патчить приложения.
Посмотрим, насколько они распространены.
Parser/tokenizer.c:
183 static char *
184 get_normal_name(char *s) /* for utf-8 and latin-1 */
185 {
186 char buf[13];
187 int i;
188 for (i = 0; i < 12; i++) {
189 int c = s[i];
190 if (c == '\0') break;
191 else if (c == '_') buf[i] = '-';
192 else buf[i] = tolower(c);
193 }
194 buf[i] = '\0';
195 if (i > 3) { /* at least 4 characters */
196 const char *p = NULL;
197 switch (buf[0]) {
198 case 'u':
199 if (strncmp(buf, "utf-8", 5) == 0)
200 p = buf + 5;
201 else if (strncmp(buf, "utf8", 4) == 0)
202 p = buf + 4;
203 if (p && (*p == '\0' || *p == '-'))
204 return "utf-8";
205 break;
206 case 'i':
207 if (strncmp(buf, "utf-8") == 0)
208 p = buf + 5;
209
210
211
212 if (strcmp(buf, "utf-8") == 0 ||
213 strncmp(buf, "utf-8-", 6) == 0) return "utf-8";
214 else if (strcmp(buf, "latin-1") == 0 ||
215 strcmp(buf, "iso-8859-1") == 0 ||
216 strcmp(buf, "iso-latin-1") == 0 ||
217 strncmp(buf, "latin-1-", 8) == 0 ||
218 strncmp(buf, "iso-8859-1-", 11) == 0 ||
219 strncmp(buf, "iso-latin-1-", 12) == 0) return "iso-8859-1";
220 else return s;gg
221 }
То есть у питона есть две стандартные кодировки, для которых почти
ничего не нужно -- utf-8 и iso-8859-1. Но в модуле encodings
определяются дополнительные алиасы, в том числе для стандартных
кодировок.
Lib/encodings/aliases.py:
395 # latin_1 codec
396 '8859' : 'latin_1',
397 'cp819' : 'latin_1',
398 'csisolatin1' : 'latin_1',
399 'ibm819' : 'latin_1',
400 'iso8859' : 'latin_1',
401 'iso_8859_1' : 'latin_1',
402 'iso_8859_1_1987' : 'latin_1',
403 'iso_ir_100' : 'latin_1',
404 'l1' : 'latin_1',
405 'latin' : 'latin_1',
406 'latin1' : 'latin_1',
...
486 # utf_8 codec
487 'u8' : 'utf_8',
488 'utf' : 'utf_8',
489 'utf8' : 'utf_8',
490 'utf8_ucs2' : 'utf_8',
491 'utf8_ucs4' : 'utf_8',
Есть искушение внести некоторые из этих алисов в Parser/tokenizer.c,
чтобы уменьшить число падений при отсутствии encodings/aliases.py.
Посмотрим, что будет по результатам пересборки с новым rpm-build-python.
Потому что теперь в python.req.py будет диагностика "non-standard encoding:",
которая мимикрирует проверку в Parser/tokenizer.c.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20071118/14820ac2/attachment-0002.bin>
Подробная информация о списке рассылки Devel