gpt4 book ai didi

c# - MonoTouch - UIDevice.CurrentDevice.Name - UTF8

转载 作者:行者123 更新时间:2023-11-30 15:04:43 24 4
gpt4 key购买 nike

我们注意到,在 MonoTouch 中使用 UIDevice.CurrentDevice.Name 时,UTF8 字符无法正确显示。

如果您使用某些特殊字符(例如按住 iPad 键盘上的撇号键),它会显示为“iPad 2 ??”。 (抱歉不知道在窗口中显示这些字符的等价物)

是否有推荐的解决方法来获取正确的文本?我们不介意自己转换为 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));

最佳答案

好的,我想我知道问题所在了。您正在创建一个 StringWriter ,它始终将其编码报告为 UTF-16(除非您覆盖 Encoding 属性)。然后,您将从 StringWriter 中获取字符串(将以 <?xml version="1.0" encoding="UTF-16" ?> 开头)并将其写入 StreamWriter这将默认为 UTF-8。编码的混合导致了问题。

最简单的方法是更改​​您的代码以传递 Stream直接到 XmlWriter - 一个 MemoryStream如果你真的想要,或者只是requestStream .这样XmlWriter可以声明它使用的编码与它实际上写入二进制数据的编码完全相同——您没有中间步骤来搞砸事情。

或者,您可以创建 StringWriter 的子类它允许您指定编码。参见 this answer一些示例代码。

关于c# - MonoTouch - UIDevice.CurrentDevice.Name - UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893909/

24 4 0