4

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!

Community
  • 1
  • 1

2 Answers2

4

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.

TheDrooper
  • 1,182
  • 1
  • 7
  • 14
  • 2
    The bug looks like a simple error in the convmap file (%DLC%/prolang/convmap/8859-1.dat), the uppercase-maps entry for ÿ (255) is 089 which is a /normal/ Y. That information also leads you to an alternative solution - make sure one of the two variables is case-sensitive. – Stefan Drissen Mar 22 '17 at 12:40
3

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

Community
  • 1
  • 1
Jensd
  • 7,886
  • 2
  • 28
  • 37