2013-12-08 128 views
-5

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

e.g

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

你用它做什么? – PCG

+0

来自db的描述(字符串)包含一些需要在前端进行读取解码的特殊字符。 – user2388013

+3

你还没有解释你对这些角色有什么问题。你正在解码的Base64字符串是如何生成的?你看到的输出结果不符合你的期望? – Corey

回答

1

这里的问题是,你已经存储在UTF-8字符串到不同编码数据库中的 - 可能是Windows-1252代码页(CP2152)。结果,由字节序列E2 80 99表示的UTF-8字符被翻译成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)。如果你的数据库中有这些值中的一个,那么它将无法正确加载。根据第一阶段转换的方式,数据库中的第三个字节可能会丢失或损坏,在这种情况下,您无法检索它。