İngilizce dilinde oku

Aracılığıyla paylaş


Azure Logic Apps'te Unicode olmayan karakter kodlamayı destekleme

Şunlar için geçerlidir: Azure Logic Apps (Tüketim + Standart)

Metin yükleriyle çalışırken, Azure Logic Apps metnin UTF-8 gibi bir Unicode biçiminde kodlanmış olduğunu çıkarsar. İş akışınızda farklı kodlamalara sahip karakterleri alma, gönderme veya işleme konusunda sorun yaşayabilirsiniz. Örneğin, Unicode desteklemeyen eski sistemlerle çalışırken düz dosyalarda bozuk karakterler alabilirsiniz.

Başka karakter kodlaması olan metinlerle çalışmak için Unicode olmayan yüke base64ToBinary kodlaması uygulayın. Bu adım, Azure Logic Apps'in metnin UTF-8 biçiminde olduğunu varsaymasını engeller. Daha sonra herhangi bir öğesini dönüştürebilirsiniz. Azure İşlevleri kullanarak UTF-8'e NET destekli kodlama.

Bu çözüm hem çok kiracılı hem de tek kiracılı iş akışlarıyla çalışır. Bu çözümü AS2 bağlayıcısı ile de kullanabilirsiniz.

Yük kodlamayı dönüştürme

İlk olarak, tetikleyicinizin içerik türünü doğru şekilde tanımlayabildiğini denetleyin. Bu adım, Azure Logic Apps'in artık metnin UTF-8 olduğunu varsaymamasını sağlar.

İçerik Türünü Çıkar özelliğine sahip tetikleyiciler ve eylemlerde Hayır'ı seçin. Bu özelliği genellikle işlemin Gelişmiş parametreler listesinde bulabilirsiniz. Ancak, işlem bu özelliği içermiyorsa, içerik türü gelen ileti tarafından ayarlanır.

Aşağıdaki listede, içerik türünü otomatik olarak çıkararak devre dışı bırakabileceğiniz bazı bağlayıcılar gösterilmektedir:

İçerik için İstek tetikleyicisini kullanıyorsanız, çağrının Content-Type üst bilgisindeki parametreyi charset ayarlamanız gerekir.text/plain Aksi takdirde karakterler bozulabilir veya parametre yükün kodlama biçimiyle eşleşmiyor olabilir. Daha fazla bilgi için içerik türünün nasıl işleneceğini text/plain gözden geçirin.

Örneğin, üst bilgi doğru charset parametreyle ayarlandığında HTTP tetikleyicisi gelen içeriği UTF-8'e Content-Type dönüştürür:

JSON
{
    "headers": {
        <...>
        "Content-Type": "text/plain; charset=windows-1250"
        },
        "body": "non UTF-8 text content"
}

Üst bilgiyi olarak application/octet-streamayarlarsanız Content-Type UTF-8 olmayan karakterler de alabilirsiniz. Daha fazla bilgi için bkz. İçerik türünü işlemeapplication/octet-stream.

Base64 kodlama içeriği

İçeriği bir dizeye base64 kodlamadan önce, metni UTF-8'e dönüştürdüğünüzden emin olun. Aksi takdirde, karakterler bozuk olarak döndürülebilir.

Ardından, herhangi bir öğesini dönüştürün. NET destekli kodlamayı başka bir öğesine kodlama. NET destekli kodlama. Azure İşlevleri kod örneğini veya .NET kod örneğini gözden geçirin:

İpucu

Tek kiracılı mantıksal uygulamalar için dönüştürme işlevini yerel olarak çalıştırarak performansı geliştirebilir ve gecikme süresini azaltabilirsiniz.

Azure İşlevleri sürümü

Aşağıdaki örnek Azure İşlevleri sürüm 2'dir:

C#
using System;
using System.IO;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;

public static class ConversionFunctionv2 {
  [FunctionName("ConversionFunctionv2")]
  public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, TraceWriter log) {
    log.Info("C# HTTP trigger function processing a request.");

    Encoding inputEncoding = null;

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    dynamic data = JsonConvert.DeserializeObject(requestBody);

    if (data == null || data.text == null || data.encodingInput == null || data.encodingOutput == null) {
      return new BadRequestObjectResult("Please pass text/encodingOutput properties in the input JSON object.");
    }

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    try {
      string encodingInput = data.encodingInput.Value;
      inputEncoding = Encoding.GetEncoding(name: encodingInput);
    } catch (ArgumentException) {
      return new BadRequestObjectResult($"Input character set value '{data.encodingInput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
    }

    Encoding encodingOutput = null;
    try {
      string outputEncoding = data.encodingOutput.Value;
      encodingOutput = Encoding.GetEncoding(outputEncoding);
    } catch (ArgumentException) {
      return new BadRequestObjectResult($"Output character set value '{data.encodingOutput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
    }

    return (ActionResult) new JsonResult(
      value: new {
        text = Convert.ToBase64String(
          Encoding.Convert(
            srcEncoding: inputEncoding,
            dstEncoding: encodingOutput,
            bytes: Convert.FromBase64String((string) data.text)))
      });
  }
}

.NET sürümü

Aşağıdaki örnek, .NET standard ve Azure İşlevleri sürüm 2 ile kullanım içindir:

C#
    using System;
    using System.IO;
    using System.Text;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json;

    public static class ConversionFunctionNET
    {
        [FunctionName("ConversionFunctionNET")]
        public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processing a request.");

            Encoding inputEncoding = null;

            string requestBody = new StreamReader(req.Body).ReadToEnd();
            dynamic data = JsonConvert.DeserializeObject(requestBody);

            if (data == null || data.text == null || data.encodingInput == null || data.encodingOutput == null)
            {
                return new BadRequestObjectResult("Please pass text/encodingOutput properties in the input JSON object.");
            }

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            try
            {
                string encodingInput = data.encodingInput.Value;
                inputEncoding = Encoding.GetEncoding(name: encodingInput);
            }
            catch (ArgumentException)
            {
                return new BadRequestObjectResult($"Input character set value '{data.encodingInput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
            }

            Encoding encodingOutput = null;
            try
            {
                string outputEncoding = data.encodingOutput.Value;
                encodingOutput = Encoding.GetEncoding(outputEncoding);
            }
            catch (ArgumentException)
            {
                return new BadRequestObjectResult($"Output character set value '{data.encodingOutput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
            }

            return (ActionResult)new JsonResult(
                value: new
                {
                    text = Convert.ToBase64String(
                        Encoding.Convert(
                            srcEncoding: inputEncoding,
                            dstEncoding: encodingOutput,
                            bytes: Convert.FromBase64String((string)data.text)))
                });
        }
    }

Aynı kavramları kullanarak iş akışınızdan Unicode olmayan bir yük de gönderebilirsiniz.

Örnek yük dönüştürmeleri

Bu örnekte base64 kodlu örnek giriş dizesi aksanlı karakterler içeren kişisel bir addır: Héloïse

Örnek giriş:

JSON
{  
    "text": "SMOpbG/Dr3Nl",
    "encodingInput": "utf-8",
    "encodingOutput": "windows-1252"
}

Örnek çıkış:

JSON
{
    "text": "U01PcGJHL0RyM05s"
}

Unicode olmayan yük gönderme

İş akışınızdan Unicode olmayan bir yük göndermeniz gerekiyorsa yükü tersten UTF-8'e dönüştürme adımlarını uygulayın. Metni UTF-8'de, sisteminizde mümkün olduğunca uzun süre tutun. Ardından, base64 ile kodlanmış UTF-8 karakterlerini gerekli kodlamaya dönüştürmek için aynı işlevi kullanın. Ardından metne base64 kodunu çözme uygulayın ve yükünüzü gönderin.

Azure İşlevleri dönüş değerini kullandığınızda, base64ToString işlevini değil base64ToBinary işlevini kullandığınızdan emin olun.

AS2 için yükleri dönüştürme

Bu çözümü AS2 v2 bağlayıcısında Unicode olmayan yüklerle de kullanabilirsiniz. AS2'ye geçirdiğiniz yükleri UTF-8'e dönüştürmezseniz, yük yorumlamasıyla ilgili sorunlarla karşılaşabilirsiniz. Bu sorunlar, yanlış yorumlanmış karakterler nedeniyle iş ortakları arasındaki MIC karması ile uyuşmazlıklara neden olabilir.

Sonraki adımlar