我们注意到在使用MonoTouch时,当使用
如果在iPad键盘上按住撇号键等一些特殊字符,则会显示为"iPad 2 ??"。(抱歉,不知道在Windows中如何显示这些字符)
有没有推荐的解决方法来获取正确的文本?我们不介意自己转换为UTF8。我也尝试从UITextField模拟这个问题,但是它运行正常--没有UTF8问题。
造成问题的原因是我们将这段文本发送到一个Web服务,并且它导致XML解析问题。
以下是XmlWriter代码的片段(
UIDevice.CurrentDevice.Name
时,UTF8字符无法正确显示。如果在iPad键盘上按住撇号键等一些特殊字符,则会显示为"iPad 2 ??"。(抱歉,不知道在Windows中如何显示这些字符)
有没有推荐的解决方法来获取正确的文本?我们不介意自己转换为UTF8。我也尝试从UITextField模拟这个问题,但是它运行正常--没有UTF8问题。
造成问题的原因是我们将这段文本发送到一个Web服务,并且它导致XML解析问题。
以下是XmlWriter代码的片段(
_parser.WriteRequest
): using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, new XmlWriterSettings
{
#if DEBUG
Indent = true,
#else
Indent = false, NewLineHandling = NewLineHandling.None,
#endif
OmitXmlDeclaration = true
}))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("REQUEST");
xmlWriter.WriteAttributeString("TYPE", "EXAMPLE");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
}
这里的 TextWriter 是从哪里传入的:
public Response MakeRequest(Request request)
{
var httpRequest = CreateRequest(request);
WriteRequest(httpRequest.GetRequestStream(), request);
using (var httpResponse = httpRequest.GetResponse() as HttpWebResponse)
{
using (var responseStream = httpResponse.GetResponseStream())
{
var response = new Response();
ReadResponse(response, responseStream);
return response;
}
}
}
private void WriteRequest(Stream requestStream, Request request)
{
if (request.Type == null)
{
throw new InvalidOperationException("Request Type was null!");
}
if (_logger.Enabled)
{
var builder = new StringBuilder();
using (var writer = new StringWriter(builder, CultureInfo.InvariantCulture))
{
_parser.WriteRequest(writer, request);
}
_logger.Log("REQUEST: " + builder.ToString());
using (requestStream)
{
using (StreamWriter writer = new StreamWriter(requestStream))
{
writer.Write(builder.ToString());
}
}
}
else
{
using (requestStream)
{
using (StreamWriter writer = new StreamWriter(requestStream))
{
_parser.WriteRequest(writer, request);
}
}
}
}
_logger
会将日志写入Console.WriteLine
,它在#if DEBUG
模式下启用。Request
只是一个带有属性的存储类,很抱歉易与HttpWebRequest
混淆。
我在XCode的控制台和MonoDevelop的控制台中都看到了“??”。由于收到错误消息,我还假设服务器也以奇怪的方式接收到了它们。使用UITextField.Text
而不是设备描述来替代这些奇怪字符的情况下没有问题。这使我认为设备描述是罪魁祸首。
编辑:
Encoding.UTF8.GetString(Encoding.ASCII.GetBytes(UIDevice.CurrentDevice.Name));
UITextField.Text
按预期返回字符,但从UIDevice.CurrentDevice.Name
获取到的是?字符,我认为这意味着“未知字符”。Jon,我不知道你也在使用MonoTouch。 - jonathanpeppersXmlWriter
的?请展示你的代码。当你说“我们得到了?字符”时,你是指Web服务接收到的,还是在调试器中看到的,还是其他什么情况?你尝试过记录字符串中每个字符的Unicode代码点吗?通常追踪这种问题只是找出你在哪里丢失数据的问题。 - Jon SkeetUTF8
现在明确地链接进来。例如,如果您稍后再次请求Name
(而不进行编码调用),会发生什么?或者MD调试器显示了什么? - poupou