我正在从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'。
答案 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)