【问题标题】:Transforming string to UTF8将字符串转换为 UTF8
【发布时间】:2015-08-12 05:38:40
【问题描述】:

我有一个通过 C# 从电子邮件收到的字符串,我想以正确的格式显示它。我知道输入为Encoding.Default的编码,根据this answer我必须将其转换为utf8,所以我尝试了这段代码:

byte[] bytes = Encoding.Default.GetBytes(input);
string strResult = Encoding.UTF8.GetString(bytes);

它可以工作,但它不能转换某些字符:
实际上在web邮件界面中原始字符串是:

باسلام همکار گرامی شماره 53018 مربوط به دبیرخانه ستاد می باشد لطفا اصلاح فرمائید 

当我用代码转换字符串时,我给出了这个结果:

باس �?ا�? �?�?�?ار گرا�?�? �?ا�?�? ش�?ار�? 53018  �?رب�?ط ب�? د ب�?رخا�?�? ستاد �?�? باشد �?طفا اص�?اح فر�?ائ�?د�? 

有什么想法吗?
更新: PS:输入变量的内容:

Ø§ÙØ²Ø§ÙØ´ تسÙÙÙØ§Øª \r\n \r\n\r\n باس ÙØ§Ù ÙÙÙØ§Ø± گراÙÙ ÙØ§ÙÙ Ø´ÙØ§Ø±Ù

【问题讨论】:

  • 那么,您已经有了一个看起来有效的字符串?它在生成的电子邮件中呈现得很糟糕吗?这是您的电子邮件未使用 utf8 编码的问题吗?
  • 您的第一行以默认方案(可能不是 UTF8)生成字节数组编码输入。您的第二行尝试使用另一种方案(UTF8)解码该字节数组,因此它变成了无意义的字符。如果你想要的是 UTF8 中的字节数组编码输入,那么你应该使用Encoding.UTF8.getBytes
  • “默认编码”是 ansi 编码,无法处理提供的字符。 Encoding.Default总是是个糟糕的选择。
  • 我建议在 webmail 界面中查看完整的电子邮件标头以找出答案。
  • 请发布input 变量的内容。如果它显示正确,则无需转换任何内容。如果它包含奇怪的字符,它将被读取为带有错误代码页的 ASCII。问号或方框表示在转换过程中丢失了字符。

标签: c# email utf-8 persian


【解决方案1】:

终于解决了问题(+),如你所知,UTF-8 代码单元值已作为 16 位代码单元序列存储在 C# 字符串中,因此我们应该验证每个代码单元是否在一个字节的范围,首先我们应该将这些值复制到字节中,然后将新的 UTF-8 字节序列转换为 UTF-16:

byte[] utf8Bytes = new byte[utf8String.Length];
for (int i=0;i<utf8String.Length;++i) {
      utf8Bytes[i] = (byte)utf8String[i];
}
var result  = Encoding.UTF8.GetString(utf8Bytes,0,utf8Bytes.Length);

所以对于这个输入:

Ø§ÙØ²Ø§ÙØ´ تسÙÙÙØ§Øª \r\n\r\n\r\n<p>Ø¨Ø§Ø³ÙØ§Ù ÙÙÙØ§Ø± گراÙÙ ÙØ§ÙÙ Ø´ÙØ§Ø±Ù&nbsp;53018 &nbsp;ÙØ±Ø¨ÙØ· ب٠د Ø¨ÙØ±Ø®Ø§Ù٠ستاد Ù٠باشد ÙØ·Ùا Ø§ØµÙØ§Ø­ ÙØ±ÙØ§Ø¦ÙØ¯\r\n\r\n

我得到了正确的结果:

افزايش تسهيلات \r\n\r\n\r\n<p>باسلام همكار گرامي نامه شماره&nbsp;53018 &nbsp;مربوط به د بيرخانه ستاد مي باشد لطفا اصلاح فرمائيد\r\n\r\n \r\n\r\n

PS:为了删除多余的字符,我使用以下代码:

result = result.Replace('\r', ' ').Replace('\n', ' ').ToString();

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2010-12-04
    • 1970-01-01
    • 2015-09-04
    • 2020-10-11
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多