diff -r 47a36d2d2b44 Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py Tue Jul 12 19:23:43 2011 -0500 +++ b/Lib/test/test_unicode.py Wed Jul 13 11:06:16 2011 +0200 @@ -584,6 +584,10 @@ self.assertEqual('{0:10000}'.format(''), ' ' * 10000) self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000) + #issue 12546 + self.assertEqual('{0:\x00<6s}'.format('foo'), 'foo\x00\x00\x00') + self.assertEqual('{0:<6s}'.format('foo'), 'foo ') + # format specifiers for user defined type self.assertEqual('{0:abc}'.format(C()), 'abc') diff -r 47a36d2d2b44 Objects/stringlib/formatter.h --- a/Objects/stringlib/formatter.h Tue Jul 12 19:23:43 2011 -0500 +++ b/Objects/stringlib/formatter.h Wed Jul 13 11:06:16 2011 +0200 @@ -182,8 +182,9 @@ Py_ssize_t consumed; int align_specified = 0; + int fill_char_specified = 0; - format->fill_char = '\0'; + format->fill_char = ' '; format->align = default_align; format->alternate = 0; format->sign = '\0'; @@ -197,6 +198,7 @@ if (end-ptr >= 2 && is_alignment_token(ptr[1])) { format->align = ptr[1]; format->fill_char = ptr[0]; + fill_char_specified = 1; align_specified = 1; ptr += 2; } @@ -220,7 +222,7 @@ } /* The special case for 0-padding (backwards compat) */ - if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') { + if (!fill_char_specified && end-ptr >= 1 && ptr[0] == '0') { format->fill_char = '0'; if (!align_specified) { format->align = '='; @@ -717,7 +719,7 @@ /* Write into that space. First the padding. */ p = fill_padding(STRINGLIB_STR(result), len, - format->fill_char=='\0'?' ':format->fill_char, + format->fill_char, lpad, rpad); /* Then the source string. */