我想知道如何最好地处理一个特殊字符,例如“使用c#?
”e.g
public static string DecodeFrom64(string toDecode)
{
byte[] arrayToDecode = System.Convert.FromBase64String(toDecode);
return System.Text.Encoding.Unicode.GetString(arrayToDecode);
}
答案 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
)。如果数据库中有这些值之一,则无法正确加载。根据您进行第一阶段转换的方式,数据库中的第三个字节可能会丢失或损坏,在这种情况下您无法检索它。