From: "andrykonchin (Andrew Konchin)" Date: 2022-08-06T11:41:30+00:00 Subject: [ruby-core:109429] [Ruby master Bug#18956] Kernel#sprintf - %c handles negative Integer argument in a confusing way Issue #18956 has been reported by andrykonchin (Andrew Konchin). ---------------------------------------- Bug #18956: Kernel#sprintf - %c handles negative Integer argument in a confusing way https://bugs.ruby-lang.org/issues/18956 * Author: andrykonchin (Andrew Konchin) * Status: Open * Priority: Normal * ruby -v: 3.0.3 * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- Integer argument for `%c `means a character codepoint. I've noticed two 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 ``` -- https://bugs.ruby-lang.org/ Unsubscribe: