从Delphi发送英镑符号到C#Web服务

时间:2009-08-05 12:45:15

标签: c# web-services delphi encoding asmx

我正在从Delphi 5向C#网络服务发送一个大字符串,我在Pound(£)标志上遇到了很多麻烦。我URLEncode来自Delphi端的字符串(似乎将它们转换为'%A3')。当它到达C#Web服务时,它显示为“ ”。我尝试使用StreamReader(如下所示)更改C#端字符串的编码,但我能做的最好的事情是更改为问号(?)。

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

如何才能正确解释英镑符号?

请帮忙!

(要求提供更多信息)

网络服务签名是:

[WebMethod]
public string ReadMyString(string PostedString)

Delphi 5代码使用我们多年来成功使用的第三方组件/代码,但这是我们第一次尝试直接与C#交谈。代码概述如下所示:

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

在这两行之间,我已确认£符号已正确转换为'%A3'。

5 个答案:

答案 0 :(得分:3)

根据你在your own answer中写的内容,看起来问题在于客户端如何编码字符串,而不是服务器如何解释它(尽管服务器需要合作,无论编码是什么你用)。您显然希望它被编码为UTF-8(如果您没有指定其他任何内容,那么这是StreamReader的默认值),但如果您使用的NetMasters库不会让我感到惊讶甚至不知道UTF-8或任何其他形式的Unicode。

Delphi 5可以通过其WideString类型处理Unicode,但它缺少很多支持实用程序功能。如果您希望使用NetMaster保留代码,那么最小的变化就是引入一个支持Unicode的库,例如免费的JCL中的 JclUnicode 单元。在那里,您可以找到Utf8Encode函数,该函数将收到WideString并返回AnsiString,然后该函数适合传递给您现有的网址编码功能。

最好完全摆脱NM代码。免费Indy library具有UTF-8编码和URL编码功能,以及所有其他与互联网相关的任务。

如果你没有在客户端使用Unicode,那么没有理由期望“£”被编码为双字节序列c2 a3。这是U + 00a3的UTF-8编码形式,是英镑字符的代码点。

如果你在客户端使用Unicode,那么你必须找出 使用的代码页。然后,在创建新StreamReader时在服务器上指定编码。

答案 1 :(得分:1)

知道了! Delphi中的URLEncode函数(使用名为NMURL的第三方组件)将£编码为'%A3',而它实际上应该是'%C2%A3'。我在Delphi端进行了手动替换以纠正它,然后在C#端完全不需要操作。

感谢您的所有建议。那将教会我对旧组件的信心!

答案 2 :(得分:0)

我建议在Delphi端使用Base64编码(将EncdDecd单元添加到您的uses子句和方法EncodeString中)并在C#侧对其进行解码。

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

答案 3 :(得分:0)

据我所知,.NET中的字符串是UTF-16,因此您可以尝试在Delphi中使用相应的Widestring< 2009.在Delphi 2009中,字符串默认为UTF-16,但请确保强制执行编码。

答案 4 :(得分:0)

来自System.Text.Encoding.Default的.Net帮助:

“获取系统当前ANSI代码页的编码。”

看起来0xA3不在该代码页中作为井号。将它切换为UTF-8,它应该正确解码该特定字符,但这是否是整体正确的编码(这是否是delphi正在发出的)我不能说。

您可以通过更改第一行来切换到UTF8:


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