Project

General

Profile

Bug #18956

Updated by andrykonchin (Andrew Konchin) over 1 year 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 
 ```

Back