【问题标题】:How do I set an encoding type on NSInputStream?如何在 NSInputStream 上设置编码类型?
【发布时间】:2015-10-29 20:55:32
【问题描述】:

我需要使用 Windows 1252 编码将图像流式传输到 .NET 后端服务。所以我相信我需要创建一个NSURLRequest,并将其HTTPBodyStream 设置为使用图像数据创建的NSInputStream。而且我需要将编码设置为 Windows 1252 或NSWindowsCP1252StringEncoding

我真的有两个问题:

  1. 我如何告诉NSInputStream 使用NSWindowsCP1252StringEncoding 传递数据或文件。
  2. 如何将 UIImage 转换为 `NSWindowsCP1252StringEncoding` 数据?我只知道 base64 方法。

编辑:

这是模拟工作客户端的示例 .NET 代码。

            wr.Method = "POST";
            wr.ContentType = "application/octet-stream";
            wr.UseDefaultCredentials = true;

            string ImagePath = @"C:\Users\smith\Desktop\Cat-and-dog.jpg";

            byte[] ibuffer = File.ReadAllBytes(ImagePath);

            wr.ContentLength = ibuffer.Length;
            Stream pData = wr.GetRequestStream();
            pData.Write(ibuffer, 0, ibuffer.Length);
            pData.Close();

            HttpWebResponse wres = wr.GetResponse() as HttpWebResponse;

            Encoding enc = System.Text.Encoding.GetEncoding(1252);

            StreamReader strRdr = new StreamReader(wres.GetResponseStream(), enc);
            string resp = strRdr.ReadToEnd();

【问题讨论】:

    标签: ios nsurlrequest foundation nsinputstream windows-1252


    【解决方案1】:
    1. 您不会告诉NSInputStream 使用什么编码,因为NSInputStream 不对字符串进行操作。 NSInputStream 为您提供原始字节。您有责任使用您想要的任何输入格式对这些字节进行解码。

      此外,由于您“需要将图像流式传输到 .NET 后端服务”,我认为您需要 NSOutputStream,而不是 NSInputStream。但这是相同的交易:您将原始字节提供给输出流。您必须自己将字符串编码为字节。

    2. UIImage 转换为任何字符编码的想法有点荒谬,因为UIImage 是像素数据,而不是文本。您首先必须解码您希望如何编码像素数据。假设您想使用 PNG 对其进行编码:

      UIImage *image = ...
      NSData *imageData = UIImagePNGRepresentation(image);
      NSData *imageBase64Data = [imageData base64EncodedDataWithOptions:0];
      

      此时,imageBase64Data 包含图像,编码为 PNG,编码为 base 64,编码为 UTF-8。您可能认为这是错误的字符编码,但 base 64 编码只使用可打印的 ASCII 字符。由于 CP1252 和 UTF-8 都是 ASCII 的超集,imageBase64Data 的内容也是有效的 CP1252。

      如果您希望有一个字符串来显式编码,您可以这样做:

      NSString *imageBase64String = [imageData base64EncodedStringWithOptions::0];
      NSData *imageBase64Data = [imageBase64String dataUsingEncoding: NSWindowsCP1252StringEncoding];
      

    【讨论】:

    • 谢谢。我同意这对我来说没有意义,但它是规范。我已经发布了一个 .NET 客户端作为示例。
    • 我不知道 .NET,但在我看来,您的示例代码将原始 JPEG 数据写入套接字而没有任何编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2010-12-29
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多