#14721 closed (fixed)
USE_THOUSAND_SEPARATOR fails with UnicodeDecodeError in several locales
Reported by: | Marti Raudsepp | Owned by: | Jannis Leidel |
---|---|---|---|
Component: | Internationalization | Version: | 1.2 |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | yes | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When I'm trying to use the {{ foo|floatformat }}
template tag with USE_THOUSAND_SEPARATOR=True
and numbers >= 1000, it fails with UnicodeDecodeError
, resulting in an empty value in the rendered template. This is a pretty plain Ubuntu 10.10 machine, tested with an empty Django project on Ubuntu-packaged Django version 1.2.3 as well as SVN trunk.
Apparently this happens because THOUSANDS_SEPARATOR
in django.conf.locale.et.formats
is a normal str
object -- not Unicode -- but contains an UTF-8 no-break space sequence.
It seems that the same no-break string is also used in bg, fi, hu, lv and uk locales!
% django-admin startproject foo % cd foo % ./manage.py shell Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) Type "copyright", "credits" or "license" for more information. IPython 0.10 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]: from django.utils import translation In [2]: from django.template.defaultfilters import floatformat In [3]: from django.conf import settings In [4]: settings.NUMBER_GROUPING=3 In [5]: settings.USE_THOUSAND_SEPARATOR=True In [6]: translation.get_language() Out[6]: 'en-us' In [7]: floatformat(1000) Out[7]: u'1,000' In [8]: translation.activate('et') In [9]: translation.get_language() Out[9]: 'et' In [10]: floatformat(1000) --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) /tmp/foo/<ipython console> in <module>() /usr/lib/pymodules/python2.6/django/template/defaultfilters.pyc in floatformat(text, arg) 164 165 if not m and p < 0: --> 166 return mark_safe(formats.number_format(u'%d' % (int(d)), 0)) 167 168 if p == 0: /usr/lib/pymodules/python2.6/django/utils/formats.pyc in number_format(value, decimal_pos) 72 decimal_pos, 73 get_format('NUMBER_GROUPING'), ---> 74 get_format('THOUSAND_SEPARATOR'), 75 ) 76 /usr/lib/pymodules/python2.6/django/utils/numberformat.pyc in format(number, decimal_sep, decimal_pos, grouping, thousand_sep) 35 for cnt, digit in enumerate(int_part[::-1]): 36 if cnt and not cnt % grouping: ---> 37 int_part_gd += thousand_sep 38 int_part_gd += digit 39 int_part = int_part_gd[::-1] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128) In [11]: from django.utils import formats In [12]: formats.get_format('THOUSAND_SEPARATOR') Out[12]: '\xc2\xa0' In [13]: formats.get_format_modules() Out[13]: [<module 'django.conf.locale.et.formats' from '/usr/lib/pymodules/python2.6/django/conf/locale/et/formats.pyc'>]
Attachments (2)
Change History (10)
comment:1 by , 14 years ago
Has patch: | set |
---|---|
milestone: | → 1.3 |
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 14 years ago
Needs tests: | set |
---|
comment:3 by , 14 years ago
Owner: | changed from | to
---|
We could even add the u before the strings in the en/formats.py to serve as good model.
comment:4 by , 14 years ago
I'd suggest using something like u'\u00a0'
, that way it's clear that it's not just a regular space, but a Unicode character.
comment:5 by , 14 years ago
I don't like Unicode sequences exposed to users. I'm adding a second version of the patch with comments instead.
by , 14 years ago
Attachment: | mark_unicode_strings2.diff added |
---|
Also add comments (and en/formats.py)
comment:6 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Unicode strings in Python files should be prefixed with 'u'.