
Issue #19784 has been updated by mame (Yusuke Endoh). Discussed at the dev meeting. We agreed that both `start_with?` and `delete_prefix` should compare character by character if valid, and byte by byte for invalid. ```ruby "\xFF\xFE".start_with?("\xFF") #=> true # not changed "\xFF\xFE".delete_prefix("\xFF") #=> "\xFE" # changed "Ä".start_with?("\xC3") #=> false # changed "Ä".delete_prefix("\xC3") #=> "Ä" # not changed ``` Note that encoding validity is checked on a position-by-position basis: ```ruby "\xFFÄ".delete_prefix("\xFF") #=> should be "Ä" "\xFFÄ".delete_prefix("\xFF\xC3") #=> should be "\xFFÄ" "\xFFÄ".delete_prefix("\xFF\xC3\x84") #=> should be "" ``` ---------------------------------------- Bug #19784: String#delete_prefix! problem https://bugs.ruby-lang.org/issues/19784#change-104272 * Author: inversion (Yura Babak) * Status: Open * Priority: Normal * ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Here is the snipped and the question is in the comments: ``` ruby fp = 'with_BOM_16.txt' body = File.read(fp).force_encoding('UTF-8') p body # "\xFF\xFE1\u00001\u0000" p body.start_with?("\xFF\xFE") # true body.delete_prefix!("\xFF\xFE") # !!! why doesn't work? p body # "\xFF\xFE1\u00001\u0000" p body.start_with?("\xFF\xFE") # true body[0, 2] = '' p body # "1\u00001\u0000" p body.start_with?("\xFF\xFE") # false ``` Works same on Linux (ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]) and Windows (ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mingw-ucrt]) -- https://bugs.ruby-lang.org/