@@ -795,6 +795,116 @@ def test_nonstring_seq_values(self):
795795 self .assertEqual ("a=a&a=b" ,
796796 urllib .parse .urlencode ({"a" : {"a" : 1 , "b" : 1 }}, True ))
797797
798+ def test_urlencode_encoding (self ):
799+ # ASCII encoding. Expect %3F with errors="replace'
800+ given = (('\u00a0 ' , '\u00c1 ' ),)
801+ expect = '%3F=%3F'
802+ result = urllib .parse .urlencode (given , encoding = "ASCII" , errors = "replace" )
803+ self .assertEqual (expect , result )
804+
805+ # Default is UTF-8 encoding.
806+ given = (('\u00a0 ' , '\u00c1 ' ),)
807+ expect = '%C2%A0=%C3%81'
808+ result = urllib .parse .urlencode (given )
809+ self .assertEqual (expect , result )
810+
811+ # Latin-1 encoding.
812+ given = (('\u00a0 ' , '\u00c1 ' ),)
813+ expect = '%A0=%C1'
814+ result = urllib .parse .urlencode (given , encoding = "latin-1" )
815+ self .assertEqual (expect , result )
816+
817+ def test_urlencode_encoding_doseq (self ):
818+ # ASCII Encoding. Expect %3F with errors="replace'
819+ given = (('\u00a0 ' , '\u00c1 ' ),)
820+ expect = '%3F=%3F'
821+ result = urllib .parse .urlencode (given , doseq = True ,
822+ encoding = "ASCII" , errors = "replace" )
823+ self .assertEqual (expect , result )
824+
825+ # ASCII Encoding. On a sequence of values.
826+ given = (("\u00a0 " , (1 , "\u00c1 " )),)
827+ expect = '%3F=1&%3F=%3F'
828+ result = urllib .parse .urlencode (given , True ,
829+ encoding = "ASCII" , errors = "replace" )
830+ self .assertEqual (expect , result )
831+
832+ # Utf-8
833+ given = (("\u00a0 " , "\u00c1 " ),)
834+ expect = '%C2%A0=%C3%81'
835+ result = urllib .parse .urlencode (given , True )
836+ self .assertEqual (expect , result )
837+
838+ given = (("\u00a0 " , (42 , "\u00c1 " )),)
839+ expect = '%C2%A0=42&%C2%A0=%C3%81'
840+ result = urllib .parse .urlencode (given , True )
841+ self .assertEqual (expect , result )
842+
843+ # latin-1
844+ given = (("\u00a0 " , "\u00c1 " ),)
845+ expect = '%A0=%C1'
846+ result = urllib .parse .urlencode (given , True , encoding = "latin-1" )
847+ self .assertEqual (expect , result )
848+
849+ given = (("\u00a0 " , (42 , "\u00c1 " )),)
850+ expect = '%A0=42&%A0=%C1'
851+ result = urllib .parse .urlencode (given , True , encoding = "latin-1" )
852+ self .assertEqual (expect , result )
853+
854+ def test_urlencode_bytes (self ):
855+ given = ((b'\xa0 \x24 ' , b'\xc1 \x24 ' ),)
856+ expect = '%A0%24=%C1%24'
857+ result = urllib .parse .urlencode (given )
858+ self .assertEqual (expect , result )
859+ result = urllib .parse .urlencode (given , True )
860+ self .assertEqual (expect , result )
861+
862+ # Sequence of values
863+ given = ((b'\xa0 \x24 ' , (42 , b'\xc1 \x24 ' )),)
864+ expect = '%A0%24=42&%A0%24=%C1%24'
865+ result = urllib .parse .urlencode (given , True )
866+ self .assertEqual (expect , result )
867+
868+ def test_urlencode_encoding_safe_parameter (self ):
869+
870+ # Send '$' (\x24) as safe character
871+ # Default utf-8 encoding
872+
873+ given = ((b'\xa0 \x24 ' , b'\xc1 \x24 ' ),)
874+ result = urllib .parse .urlencode (given , safe = ":$" )
875+ expect = '%A0$=%C1$'
876+ self .assertEqual (expect , result )
877+
878+ given = ((b'\xa0 \x24 ' , b'\xc1 \x24 ' ),)
879+ result = urllib .parse .urlencode (given , doseq = True , safe = ":$" )
880+ expect = '%A0$=%C1$'
881+ self .assertEqual (expect , result )
882+
883+ # Safe parameter in sequence
884+ given = ((b'\xa0 \x24 ' , (b'\xc1 \x24 ' , 0xd , 42 )),)
885+ expect = '%A0$=%C1$&%A0$=13&%A0$=42'
886+ result = urllib .parse .urlencode (given , True , safe = ":$" )
887+ self .assertEqual (expect , result )
888+
889+ # Test all above in latin-1 encoding
890+
891+ given = ((b'\xa0 \x24 ' , b'\xc1 \x24 ' ),)
892+ result = urllib .parse .urlencode (given , safe = ":$" ,
893+ encoding = "latin-1" )
894+ expect = '%A0$=%C1$'
895+ self .assertEqual (expect , result )
896+
897+ given = ((b'\xa0 \x24 ' , b'\xc1 \x24 ' ),)
898+ expect = '%A0$=%C1$'
899+ result = urllib .parse .urlencode (given , doseq = True , safe = ":$" ,
900+ encoding = "latin-1" )
901+
902+ given = ((b'\xa0 \x24 ' , (b'\xc1 \x24 ' , 0xd , 42 )),)
903+ expect = '%A0$=%C1$&%A0$=13&%A0$=42'
904+ result = urllib .parse .urlencode (given , True , safe = ":$" ,
905+ encoding = "latin-1" )
906+ self .assertEqual (expect , result )
907+
798908class Pathname_Tests (unittest .TestCase ):
799909 """Test pathname2url() and url2pathname()"""
800910
0 commit comments