在客户端的服务器+ GWT上使用.NET c#,我有一个Web表单,它接受用户输入,然后我从中构造XML字符串并将其存储在数据库中。然后,我需要从数据库中读回它,通过tcp将其发送到手持设备并将其解析为XElement。一切顺利,直到你从word或excel复制和粘贴文本,在这种情况下我尝试这样做:
XElement.parse(str);
它抛出异常:
'.', hexadecimal value 0x00, is an invalid character. Line 132, position 111.
导致此问题的示例字符是右撇号char(0x2019)。现在可能有一大堆特殊字符可能从excel / word等复制粘贴。处理这个问题的最佳方法是什么?以下是我如何从流构造字符串:
protected CallResult callUsingSocketClass(string methodName, params Action<CallParameters>[] addParameters)
{ WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_ENTRY_EXIT,“++ Call({0},...)”,methodName);
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
CallParameters parameters = new CallParameters(this, methodName);
foreach (var addParameter in addParameters)
{
addParameter(parameters);
}
string post = this.CreatePost(parameters);
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC(Method={0}, host={1}, port={2}, post='{3}')", methodName, this.Host, this.Port, post);
byte[] postBytes = Encoding.UTF8.GetBytes(post);
//
// Send the request and wait for the reply.
//
char[] replyContentChars = null;
for (int attempts = 0; attempts < 3; attempts++)
{
Socket socket = null;
try
{
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - creating socket for RPC call...");
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
string hostID = this.Host;
if (this.HostIPAddress != null)
{
hostID = this.HostIPAddress;
}
using (socket = this.connectToServer(hostID, this.Port))
{
if (socket == null)
{
return null;
}
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - socket created!");
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - communicating with server...");
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - writing post...");
this.sendDataToServer(socket, postBytes);
int replyLength = -1;
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - reading reply...");
using (var reader = this.receiveStreamFromServer(socket))
{
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
socket.Close();
socket = null;
return null;
}
}
for (; ; )
{
string lineRaw = reader.ReadLine().Trim();
string line = lineRaw.ToLowerInvariant();
if (line.StartsWith("content-length:"))
{
replyLength = int.Parse(line.Substring(15));
}
else if (line == "")
{
if (replyLength < 0)
{
throw new InvalidOperationException("Reply hasn't specified content-length");
}
break;
}
else
{
if (this.CookieJar != null)
{
this.CookieJar.ProcessFromServer(lineRaw);
}
}
}
// Content starts here
replyContentChars = new char[replyLength];
int replyRecv = 0;
do
{
int charsRecv = reader.Read(replyContentChars, replyRecv, replyLength - replyRecv);
if (charsRecv <= 0)
{
break;
}
replyRecv += charsRecv;
} while (replyRecv < replyLength);
//int charsRecv = reader.Read(replyContentChars, 0, replyLength);
if (replyRecv != replyLength)
{
untime.Logger.Logger.Error("Web Service call '{0}' received {1} bytes, header indicated {2} bytes", methodName, replyRecv, replyLength);
throw new InvalidOperationException(String.Format("Have not received all of reply data - received {0} bytes, expected {1}", replyRecv, replyLength));
}
}
socket.Close();
socket = null;
}
}
catch (Exception e)
{
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC - exception thrown - {0} [{1},{2}]", e.Message, e.Source, e.StackTrace);
}
finally
{
if (socket != null)
{
socket.Close();
socket = null;
}
}
if (replyContentChars != null)
{
break;
}
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
}
//
// Verify that data has been received.
//
if (replyContentChars == null)
{
return null;
}
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
//
// Process the received data.
//
string replyContent = new string(replyContentChars);
WebServicesClient.Debug.DebugMessage(WebServicesClient.Debug.MASK_RPC_CALL, "RPC(Method={0}, replyContent='{1}')", methodName, replyContent);
XElement xReplyContent = XElement.Parse(replyContent);
var xReplyBody = xReplyContent.Element(nsSoap + "Body");
var xFault = xReplyBody.Element(nsSoap + "Fault");
if (xFault != null)
{
// Something has gone wrong on the server
var xFaultCode = xFault.Element(nsSoap + "Code");
var xFaultReason = xFault.Element(nsSoap + "Reason");
untime.Logger.Logger.Error("Web Service call to method '{0}' failed: Code='{1}', Reason='{2}'", methodName, (string)xFaultCode, (string)xFaultReason);
string faultCode = (string)xFaultCode;
var codeParts = faultCode.Split(':');
XmlQualifiedName xmlQualifiedName;
if (codeParts.Length == 2)
{
xmlQualifiedName = new XmlQualifiedName(codeParts[1], codeParts[0]);
}
else
{
xmlQualifiedName = new XmlQualifiedName(faultCode);
}
throw new SoapException((string)xFaultReason, xmlQualifiedName);
}
var xResponse = xReplyBody.Element(this.nsArgs + (methodName + "Response"));
var xResult = xResponse.Element(this.nsArgs + (methodName + "Result"));
if (this.OnTransferring != null)
{
if (!this.OnTransferring())
{
return null;
}
}
var result = new CallResult(xResult);
return result;
}
答案 0 :(得分:0)
System.Text.Encoding.UTF8
因为看起来Excel使用utf。转换为您喜欢的编码。
答案 1 :(得分:0)
我在这里找到了问题的答案:
想法是从输入中剥离/替换unicode字符,或者在构造时使用XML中的unicode编码:
<?xml version="1.0" encoding="UTF-16"?>
在上面的帖子中,接受的答案表明以下方法(粘贴在这里)工作正常,但如果你需要替换某些字符,你必须添加一些代码来做到这一点:
public string getRidOfUnprintablesAndUnicode ( string inpString )
{
string outputs = String.Empty;
for ( int jj = 0; jj < inpString.Length; jj++ )
{
char ch = inpString[ jj ];
if ( ( ( int )( byte )ch ) >= 32 & ( ( int )( byte )ch ) <= 128 )
{
outputs += ch;
}
}
return outputs;
}