Q:

Strange results when deleting all special characters from a string in Progress / OpenEdge

I have the code snippet below (as suggested in this previous Stack Overflow answer ... Deleting all special characters from a string in progress 4GL) which is attempting to remove all extended characters from a string so that I may transmit it to a customer's system which will not accept any extended characters.

do v-int = 128 to 255:
  assign v-string = replace(v-string,chr(v-int),"").

end.

It is working perfectly with one exception (which makes me fear there may be others I have not caught).  When it gets to 255, it will replace all 'y's in the string.
If I do the following ...

display chr(255) = chr(121).   /* 121 is asc code of y */

I get true as the result.
And therefore, if I do the following ...

display replace("This is really strange",chr(255),"").

I get the following result:

This is reall strange

I have verified that 'y' is the only character affected by running the following:

def var v-string as char init "abcdefghijklmnopqrstuvwxyz".
  def var v-int as int.
do v-int = 128 to 255:
assign v-string = replace(v-string,chr(v-int),"").
end.
display v-string.

Which results in the following:

abcdefghijklmnopqrstuvwxz

I know I can fix this by removing 255 from the range but I would like to understand why this is happening.
Is this a character collation set issue or am I missing something simpler?
Thanks for any help!

A:

This is a bug. Here's a Progress Knowledge Base article about it:
http://knowledgebase.progress.com/articles/Article/000046181
The workaround is to specify the codepage in the CHR() statement, like this:
CHR(255, "UTF-8", "1252")

Here it is in your example:
def var v-string as char init "abcdefghijklmnopqrstuvwxyz". def var v-int as int.

do v-int = 128 to 255:

assign v-string = replace(v-string, chr(v-int, "UTF-8", "1252"), "").

end.

display v-string.

You should now see the 'y' in the output.

A:

This seems to be a bug!

The REPLACE() function returns an unexpected result when replacing character CHR(255) (ÿ)  in a String.
The REPLACE() function modifies the value of the target character, but additionally it changes any occurrence of characters  'Y' and 'y' present in the String.
This behavior seems to affect only the character ÿ. Other characters are correctly changed by REPLACE().
Using default codepage ISO-8859-1

Link to knowledgebase

