Bug #18956
Updated by andrykonchin (Andrew Konchin) over 2 years ago
Integer argument for `%c `means a character codepoint. I've noticed two outcomes when argument is negative: outcomes: - exception - broken/incorrect string When exception is raised - its message a bit misleading and confusing: ```ruby sprintf("%c", -1000) # => invalid character (ArgumentError) sprintf("%c".encode('ascii'), -1) # => 4294967295 out of char range (RangeError) ``` `invalid character` means there is a character, but actual argument is a codepoint. `4294967295 out of char range` is about codepoint, but it mentions `4294967295` instead of actual argument `-1`. ```ruby sprintf("%c", -1) # => "\xFF" ``` In this case no exception is risen but the string is not valid: ```ruby sprintf("%c", -1).codepoints # => invalid byte sequence in UTF-8 (ArgumentError) sprintf("%c", -1).valid_encoding? # => false ```