Suporte codificação de caracteres não unicode em Apps LógicasSupport non-Unicode character encoding in Logic Apps

Quando trabalha com cargas de texto, a Azure Logic Apps infere que o texto é codificado num formato Unicode, como UTF-8.When you work with text payloads, Azure Logic Apps infers the text is encoded in a Unicode format, such as UTF-8. Pode ter problemas em receber, enviar ou processar caracteres com diferentes codificações no seu fluxo de trabalho.You might have problems receiving, sending, or processing characters with different encodings in your workflow. Por exemplo, pode obter caracteres corrompidos em ficheiros planos quando trabalhar com sistemas antigos que não suportam o Unicode.For example, you might get corrupted characters in flat files when working with legacy systems that don't support Unicode.

Para trabalhar com texto que tenha outra codificação de caracteres, aplique codificação base64 para a carga útil não-Unicode.To work with text that has other character encoding, apply base64 encoding to the non-Unicode payload. Este passo impede que as Aplicações Lógicas assumam que o texto está no formato UTF-8.This step prevents Logic Apps from assuming the text is in UTF-8 format. Em seguida, pode converter qualquer . Codificação suportada pela NET para UTF-8 utilizando Funções Azure.You can then convert any .NET-supported encoding to UTF-8 using Azure Functions.

Esta solução funciona com fluxos de trabalho de inquilinos múltiplos e únicos inquilinos.This solution works with both multi-tenant and single-tenant workflows. Também pode utilizar esta solução com o conector AS2.You can also use this solution with the AS2 connector.

Converter codificação de carga útilConvert payload encoding

Primeiro, verifique se o seu gatilho pode identificar corretamente o tipo de conteúdo.First, check that your trigger can correctly identify the content type. Este passo garante que as Aplicações Lógicas já não assumem que o texto é UTF-8.This step ensures that Logic Apps no longer assumes the text is UTF-8.

Para gatilhos com a definição Infer Content Type, escolha .For triggers with the setting Infer Content Type, choose No. Se o seu gatilho não tiver esta opção, o tipo de conteúdo é definido pela mensagem de entrada.If your trigger doesn't have this option, the content type is set by the incoming message.

Se estiver a utilizar o gatilho de pedido HTTP para text/plain conteúdo, deve definir o charset parâmetro no Content-Type cabeçalho da chamada.If you're using the HTTP request trigger for text/plain content, you must set the charset parameter in the Content-Type header of the call. Os caracteres podem ficar corrompidos se não definirmos o charset parâmetro, ou o parâmetro não corresponder ao formato de codificação da carga útil.Characters might become corrupted if you don't set the charset parameter, or the parameter doesn't match the payload's encoding format. Para obter mais informações, consulte como lidar com o tipo de text/plain conteúdo.For more information, see how to handle the text/plain content type.

Por exemplo, o gatilho HTTP converte o conteúdo de entrada para UTF-8 quando o Content-Type cabeçalho é definido com o charset parâmetro correto:For example, the HTTP trigger converts the incoming content to UTF-8 when the Content-Type header is set with the correct charset parameter:

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

Se definir o Content-Type cabeçalho application/octet-stream para , também poderá receber caracteres que não são UTF-8.If you set the Content-Type header to application/octet-stream, you also might receive characters that aren't UTF-8. Para obter mais informações, consulte como lidar com o tipo de application/octet-stream conteúdo.For more information, see how to handle the application/octet-stream content type.

Base64 codificar conteúdoBase64 encode content

Antes de basear o conteúdo de codificação 64, certifique-se de que converteu o texto para UTF-8.Before you base64 encode content, make sure you've converted the text to UTF-8. Se basear64 descodificar o conteúdo para uma cadeia antes de converter o texto para UTF-8, os caracteres podem voltar corrompidos.If you base64 decode the content to a string before converting the text to UTF-8, characters might return corrupted.

Em seguida, converta qualquer . Codificação suportada pela NET para outra . Codificação suportada pela NET.Next, convert any .NET-supported encoding to another .NET-supported encoding. Reveja o exemplo do código Azure Functions ou o exemplo do código .NET:Review the Azure Functions code example or the .NET code example:

Dica

Para aplicações lógicas de inquilino único, você pode melhorar o desempenho e diminuir a latência executando localmente a função de conversão.For single-tenant logic apps, you can improve performance and decrease latency by locally running the conversion function.

Versão Azure FunctionsAzure Functions version

O exemplo a seguir é para a versão 2 do Azure Functions:The following example is for Azure Functions version 2:

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)))
      });
  }
}

Versão .NET.NET version

O exemplo a seguir é a utilização com a norma .NET e a versão 2 das Funções Azure:The following example is for use with .NET standard and Azure Functions version 2:

    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)))
                });
        }
    }

Utilizando estes mesmos conceitos, também pode enviar uma carga útil não unicode a partir do seu fluxo de trabalho.Using these same concepts, you can also send a non-Unicode payload from your workflow.

Conversões de carga útil da amostraSample payload conversions

Neste exemplo, a cadeia de entrada de amostra codificada base64 é um nome pessoal, H é lo ï se, que contém caracteres acentuados.In this example, the base64-encoded sample input string is a personal name, Héloïse, that contains accented characters.

Entrada de exemplo:Example input:

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

Exemplo de saída:Example output:

{
    "text": "U01PcGJHL0RyM05s"
}

Enviar carga útil não-UnicodeSend non-Unicode payload

Se precisar de enviar uma carga útil não-Unicode do seu fluxo de trabalho, faça os passos para converter a carga útil para UTF-8 ao contrário.If you need to send a non-Unicode payload from your workflow, do the steps for converting the payload to UTF-8 in reverse. Mantenha o texto no UTF-8 o máximo possível dentro do seu sistema.Keep the text in UTF-8 as long as possible within your system. Em seguida, utilize a mesma função para converter os caracteres UTF-8 codificados de base64 para a codificação necessária.Next, use the same function to convert the base64-encoded UTF-8 characters to the required encoding. Em seguida, aplique a descodão base64 no texto e envie a sua carga útil.Then, apply base64 decoding to the text, and send your payload.

Converter cargas para AS2Convert payloads for AS2

Também pode utilizar esta solução com cargas não unicódigos no conector AS2 v2.You can also use this solution with non-Unicode payloads in the AS2 v2 connector. Se não converter cargas que passa para AS2 para UTF-8, poderá ter problemas com a interpretação da carga útil.If you don't convert payloads that you pass to AS2 to UTF-8, you might experience problems with the payload interpretation. Estes problemas podem resultar num desfasamento com o haxixe MIC entre os parceiros devido a caracteres mal interpretados.These problems might result in a mismatch with the MIC hash between the partners because of misinterpreted characters.

Passos seguintesNext steps