【问题标题】:Encoding Persian string using C#使用 C# 编码波斯语字符串
【发布时间】:2020-06-28 10:15:21
【问题描述】:

我正在使用 C# 为银行开发一个 SMS 应用程序,该应用程序通过 SMS 网关向客户发送交易警报,即 ATM 交易。该应用程序运行良好,唯一的问题是对波斯文本进行编码,它没有正确编码波斯文本。

这是将波斯文本编码为 UTF-16 格式的方法。

public static string Endian2UTF(string s)        
{

     Encoding ui = Encoding.BigEndianUnicode;              
     Encoding u8 = Encoding.UTF8;              
     string str = u8.GetString(ui.GetBytes(s));              
     return str;          
}

某些字符没有正确编码,移动设备上的消息如下所示

مستری뾽뾽رامیۯمابیمیار500.00اسانهۯاززابخوبادماشۯ뾽뾽뾽ص뾽뾽뾽뾽뾽뾽ددد뾽ما。

问题仅在于您在上面看到的某些字符。 供您参考,英文字符串没有问题。

【问题讨论】:

  • 输入字符串已经是 UTF-16。展示你如何收到它。您可以将 icoming 数据加载到 byte[] 而不是 string 然后才解码吗?
  • a string is a string is a string - 编码不适用:仅在string 和字节之间转换时适用。所以:无论这里发生什么,它都适用于string 和字节之间的边界。您使用什么 API 发送短信?大概它适用于那里。您可能需要指定特定的代码页或类似代码,但坦率地说:如今大多数 API 都使用 UTF-8。
  • 亲爱的@MarcGravell,感谢您的回复。 API 接受以下格式的 unicode 字符串(“\u0006E\u00064\u0006*\u00061\u0006�\0 \u0006�\u00061\u0006'\u0006E\u0006�”)。带有 ? 的字符标记表示错误编码。
  • 啊。您的库已经具有执行十六进制操作的功能。检查Tools.cs中的方法。

标签: c# sms farsi


【解决方案1】:

最后,我找到了问题所在。在库中某个地方的文本编码不正确,所以我使用调试器断点跟踪它并找到了根案例。一旦我将其更改为 BigEndianUnicode,它将消息编码为 UTF8。它就像一个魅力。这是代码。您需要在 SMPPClient.cs 文件中应用以下 SendSms 方法的更改。

if (dataCoding == 8)
{
   //data = Encoding.UTF8.GetBytes(text);
     data = Encoding.BigEndianUnicode.GetBytes(text);
}
else
{
    data = Encoding.ASCII.GetBytes(text);
}

如果 SMS 仍然作为垃圾发送,您还需要应用其他更改。注释 SMMPClient.cs 中将文本编码为 UTF 的部分

if (dataCoding == 8)
{
    //text = Tools.Endian2UTF(text);
      maxLength = 70;
}

我希望这可以帮助任何使用 EasySMPP 库向客户端发送短信的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多