处理特殊字符

时间:2013-12-08 23:20:32

标签: c# encoding

我想知道如何最好地处理一个特殊字符,例如“使用c#?

e.g

public static string DecodeFrom64(string toDecode)
{
   byte[] arrayToDecode = System.Convert.FromBase64String(toDecode);
   return  System.Text.Encoding.Unicode.GetString(arrayToDecode);
}

1 个答案:

答案 0 :(得分:1)

这里的问题是您已将UTF-8字符串存储到数据库中的其他编码 - 可能是Windows-1252代码页(CP2152)。结果,字节序列UTF-8表示的字符E2 80 99被转换为CP2152单字节字符’。这一切都在之前的this answer中解释过,这也为您当前的问题提供了解决方案。

为了返回原始的UTF-8编码,您需要从数据库中返回字符串并使用以下代码进行更正:

public static string UTF8From1252(string source)
{
    // get original UTF-8 bytes from CP1252-encoded string
    byte[] bytes = System.Text.Encoding.GetEncoding("windows-1252").GetBytes(source);
    return System.Text.Encoding.UTF8.GetString(bytes);
}

这突出了使用GetBytes方法时始终使用正确编码至关重要的事实。

重要的是要注意,这种转换的反向并不总是可行,因为CP2152代码空间中存在间隙 - 在从字节值转换期间将丢弃或更改的值。

这些差距的十六进制值为:81 8D 8F 90 9D

不幸的是,这些值存在于各种UTF-8编码中,例如E2 80 9D)。如果数据库中有这些值之一,则无法正确加载。根据您进行第一阶段转换的方式,数据库中的第三个字节可能会丢失或损坏,在这种情况下您无法检索它。