2009-08-05 17 views
2

Delphi 5からC#Webサービスに大きな文字列を送信していますが、私はポンド(£)記号で多くの問題を抱えています。 Delphi側から文字列をURLエンコードします( '%A3'に変換するようです)。 C#Webサービスに到達すると、 ' 'と表示されます。私はStreamReaderを使用してC#側の文字列のエンコーディングを変更しようとしましたが(下図参照)、できることは疑問符(?)に変更することです。デルファイからC#Webサービスへのポンド記号の送信

MemoryStream mr = new MemoryStream(System.Text.Encoding.Default.GetBytes(myString)); 
StreamReader sr = new StreamReader(mr, System.Text.Encoding.Default); 
string s = sr.ReadToEnd(); 

どのようにして£記号が正しく解釈されるのですか?

助けてください!

(さらに詳細には要求された)

Webサービスのシグネチャは次のとおりです。

[WebMethod] 
public string ReadMyString(string PostedString) 

デルファイ5のコードは、私たちが長年成功裏に使用してきたサードパーティのコンポーネント/コードを使用しますが、これは初めて私たちはC#に直接話してみました。コードの概要は以下の通りである:私は£記号が正しく「%A3」に変換されていることを確認したこれら二つの線の間

tmp_Str := URLEncode(myBigString); 
tmp_Str := WinInetPostData(myURL, tmp_Str); 

を。

+1

少し詳細を入力してください。どのように送信していますか? Webサービス操作の署名とは何ですか? ASMXまたはWCF?実際のコードを表示してください。 –

+0

要望に応じて詳細が追加されました。 – JamesW

+0

署名によって、私はメソッドヘッダーを意味します: '[WebMethod] public int Operation(文字列パラメーター)' –

答えて

3

your own answerに書き込んだ内容に基づいて、クライアント側が文字列をどのようにエンコードしているかに問題があるように見えます(サーバーはどのエンコードを使用しても連携する必要があります) 。明らかにUTF-8でエンコードされることを期待しています(何も指定しなければStreamReaderのデフォルトです)。しかし、使用しているNetMastersライブラリでもわからないUTF-8または他の形式のUnicodeを使用します。

デルファイ5は、WideString型でUnicodeをうまく処理できますが、多くのサポートユーティリティ機能がありません。あなたのコードをNetMastersで保持したい場合は、JCLからJclUnicodeユニットのようなユニコード対応ライブラリを導入することです。そこにWideStringを受け取ってAnsiStringを返すUtf8Encode関数があります。これはあなたの既存のURLエンコーディング関数に渡すのに適しています。

NMコードを削除する方が良いでしょう。無料のIndy libraryには、UTF-8エンコーディングとURLエンコーディングだけでなく、インターネット関連の他のすべてのタスクも含まれています。

クライアント側でUnicodeを使用していない場合は、 "£"が2バイトシーケンスc2 a3としてエンコードされることを期待する理由はありません。それはポンド文字のコードポイントであるU + 00a3のUTF-8エンコード形式です。

あなたがクライアント上でUnicodeを使用してないしている場合は、あなた使用しているコードページを見つける必要があります。新しいStreamReaderを作成するときに、サーバーでそのエンコードを指定します。

0

私は、Delphi側でBase64エンコードを使用することをお勧めします..でC#の側に

public static string DecodeString(string base64EncodedString) 
    { 
    byte[] dataToDecode = Convert.FromBase64String(base64EncodedString); 
    string result = Encoding.ASCII.GetString(dataToDecode); 
    return result; 
    } 

幸運を、それを(自分のuses節とメソッドEncodeStringにユニットEncdDecdを追加)し、デコードします。

+0

を更新していただきありがとうございます。私はそれを試みたが、私は恐れている疑問符をまだ得る。私は問題がC#側にあると確信しています... – JamesW

0

.NETでの文字列がUTF-16なので、Delphi < 2009の対応するWidestringを使用してみてください。Delphi 2009では、文字列はデフォルトでUTF-16ですが、エンコードを強制してください。 System.Text.Encoding.Defaultのための.NETヘルプから

+0

申し訳ありませんが、それはDelphi 5(古代!)だと言いました - しかし、私はあなたの提案を試して、私は恐れている幸運を持っていませんでした。とにかくありがとう – JamesW

0

「は、システムの現在のANSIコードページのエンコーディングを取得します。」

0xA3がそのコードページにポンド記号として表示されていないように見えます。それをUTF-8に切り替えると、その特定の文字を正しくデコードする必要がありますが、それが正しいエンコーディングであるかどうか(それがDelphiのものであるかどうか)は言いません。

あなたはそうのようなあなたの最初の行を変更することにより、UTF8に切り替えることができます。

 

MemoryStream mr = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(myString) 
 
+0

ありがとうが、私はまだあなたの提案と小さな正方形を取得します。 – JamesW

+0

それをこすってください。ポンド記号はUTF8で2バイトになります。 GetEncoding(int)オーバーロードを使用して英国コードページを指定してみてください。例えば。英国コードページのGetEncoding(1252)。 コードページの一覧については、(http://www.lingoes.net/en/translator/codepage.htm)を参照してください。 – redcalx

1

はそれを手に入れました! DelphiのURLEncode関数(NMURLという第三者コンポーネントを使用)は、実際に '%C2%A3'になる必要がある場合、£を '%A3'としてエンコードします。私はそれを訂正するためにデルファイの側で手作業で置き換えを行いました。そして、それはC#側で全く操作を必要としません。

ご意見ありがとうございます。それは私に古いコンポーネントへの私の信念を置くよう教えてくれるでしょう!

+4

あなた自身を**巨人**好意を持って、急いでNetMastersのコードを捨てなさい! Delphiでリリースされたときにはバグだったが、今でもまだバギーだがサポートされていない。できるだけ早くIndyやICSのような良いライブラリに切り替えてください。 –

関連する問題