2017-03-21 3 views
4

以下のようなコードスニペットがあります(前述のスタックオーバーフローの回答... Deleting all special characters from a string in progress 4GL)。私は拡張された文字を受け入れない顧客のシステムにそれを送るかもしれません。Progress/OpenEdgeの文字列からすべての特殊文字を削除すると奇妙な結果が発生する

V-INT = 128〜255の操作を行います。

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

終わりを。

これは1つの例外を除いて完全に動作しています(これは私が捕まえていない他のものがあるかもしれないことを私に恐れさせる)。 255になると、文字列中のすべての 'y'が置換されます。

私は、次の...

表示CHRを行う場合(255)= CHR(121)。/* 121はyのアスキーコード*/

結果として真になります。

そのため、私がしなければ、次の...

表示置き換える( "これは本当に奇妙である"、CHR(255)、 "")。

私は、次のような結果を得る:

:これは私が 'Y' は、以下を実行して、影響を受けた唯一の文字であることを確認した奇妙な

reallある

def var v-stringをchar init "abcdefghijklmnopqrstuvwxyz"として指定します。 def var v-intをintとして指定します。

V-INT = 128〜255の操作を行います。

アサインV-文字列を=(V-文字列、CHRを(V-INT)、 "")に置き換えます。

end。

ディスプレイのvストリング。以下になり

abcdefghijklmnopqrstuvwxz

私は範囲から255を除去することによって、この問題を解決することができます知っているが、私はこれが起こっている理由を理解したいと思います。

これは文字の照合セットの問題ですか、それとももっと簡単なものがありますか?

ありがとうございました!

答えて

3

これはバグのようです!

文字列の文字CHR(255)(ÿ)を置換するときに、REPLACE()関数が予期しない結果を返します。

REPLACE()関数は、ターゲット文字の値を変更しますが、さらに、文字列内に存在する文字「Y」および「y」を変更します。

この現象は文字ÿにのみ影響するようです。他の文字はREPLACE()によって正しく変更されます。

これはバグであるデフォルトのコードページISO-8859-1

Link to knowledgebase

+1

ありがとうございます!それがまさに私が必要としていたものです。 –

+1

問題ありません。しかしupvoteを好む! :) – Jensd

+0

私はupvoteをしようとしたが、私は新しい登録者であるので、それは私を許さなかった。 : –

3

を使用します。ここではそれについての進捗状況Knowledge Baseの記事です:

http://knowledgebase.progress.com/articles/Article/000046181

回避策は、このように、CHR()文でコードページを指定することです:

CHR(255, "UTF-8", "1252") 

ここでは、それはあなたの例である:

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. 

出力に 'y'が表示されるはずです。

+1

バグはconvmapファイル(%DLC%/ prolang) /convmap/8859-1.dat)の場合、ÿ(255)の大文字マップエントリは/ normal/Yの089です。 この情報によって、代替ソリューションが導かれます。大文字と小文字を区別。 –

関連する問題