2010-04-13 262 views
29

我有一个问题,将.NET字符串编码为base64时使用哪种Unicode编码?我知道Windows上的字符串是UTF-16编码,所以我的编码方式是正确的吗?将.net字符串对象转换为base64编码字符串

public static String ToBase64String(this String source) { 
     return Convert.ToBase64String(Encoding.Unicode.GetBytes(source)); 
    } 

回答

23

你提供的是完美的功能。它将产生以UTF-16编码的源字符串字节的base64编码字符串。

如果你问UTF-16是否可以表示字符串中的任何字符,那么是的。 UTF-16和UTF-32唯一的区别在于UTF-16是一种可变长度编码;它使用两个字节来表示子集内的字符,其他字符使用四个字节。

没有Unicode字符不能用UTF-16表示。

+2

*“没有unicode字符不能用UTF-16表示。”*实际上是通过任何其他转换(UTF)。 – 2014-12-30 11:39:50

2

MSDN确认UnicodeEncoding类表示编码为Unicode字符的UTF-16

+0

如果我的字符串不仅包含英文字母和小数位,它还能正常工作吗? – chester89 2010-04-13 18:45:20

+2

@ chester89:这是Unicode的! – abatishchev 2010-04-13 19:12:06

3

请注意,您不要使用UTF-16,因为这正是.NET字符串所使用的。当你创建该字节数组时,你可以自由选择任何编码来处理字符串中的所有字符。例如,如果文本是基于拉丁文的语言,UTF-8会更有效,但它仍然可以处理每个已知字符。

最重要的问题是,无论软件解码base64字符串,都需要知道将哪种编码应用于字节数组以重新创建原始字符串。

4

这里是解决方案,我已经转换了一个随机字符串转换,就像您可以给任何大小,最多10个Base64将输出。

//This function will return a random string from the given numeric characters 
public string RandomString(int size) 
{ 
const string legalCharacters = "1234567890"; 
Random random = new Random(); 
StringBuilder builder = new StringBuilder(); 
char ch = '\0'; 

for (int i = 0; i <= size - 1; i++) { 
    ch = legalCharacters(random.Next(0, legalCharacters.Length)); 
    builder.Append(ch); 
} 
return builder.ToString(); 
} 
public const string BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; 
public string DecToBase64(long lVal) 
{ 
string sVal = null; 
sVal = ""; 
while (lVal >= 64) { 
    sVal = sVal + DecToBase64(lVal/64); 
    lVal = lVal - 64 * (lVal/64); 
} 
sVal = sVal + Strings.Mid(BASE64, Convert.ToInt32(lVal) + 1, 1); 
return sVal; 
} 

//here is how we can have result in variable: 
string Base64 = ""; 
Base64 = DecToBase64(RandomString(10)); //this will produce a combination up-to length of 10