2010-04-13 12 views
29

Ich habe eine Frage, welche Unicode-Codierung beim Codieren von .NET-Zeichenfolge in Base64 verwenden? Ich weiß, dass Zeichenketten unter Windows UTF-16-codiert sind. Ist also meine Art zu codieren die richtige?Convert .net String-Objekt in Base64-codierte Zeichenfolge

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

Antwort

23

Was Sie zur Verfügung gestellt haben, ist perfekt funktional. Es wird eine Base64-codierte Zeichenfolge der Bytes Ihrer Quellzeichenfolge, die in UTF-16 codiert sind, erzeugen.

Wenn Sie fragen, ob UTF-16 ein beliebiges Zeichen in Ihrer Zeichenfolge darstellen kann, dann ja. Der einzige Unterschied zwischen UTF-16 und UTF-32 besteht darin, dass UTF-16 eine Codierung mit variabler Länge ist; Es verwendet zwei Bytes zur Darstellung von Zeichen innerhalb einer Teilmenge und vier Bytes für alle anderen Zeichen.

Es gibt keine Unicode-Zeichen, die nicht durch UTF-16 dargestellt werden können.

+2

* "Es gibt keine Unicode-Zeichen, die nicht durch UTF-16 dargestellt werden können." * Oder tatsächlich durch eine der anderen Transformationen (UTFs). –

2

MSDN bestätigt, dass UnicodeEncoding Klasse eine UTF-16 Codierung von Unicode-Zeichen darstellt.

+0

Wenn meine Zeichenfolge nicht nur englische Buchstaben und Dezimalziffern enthält, wird sie trotzdem korrekt funktionieren? – chester89

+2

@ chester89: das ist was für Unicode ist! – abatishchev

3

Beachten Sie, dass Sie nicht verwenden müssen, um UTF-16 zu verwenden, nur weil das ist, was .NET-Zeichenfolgen verwenden. Wenn Sie dieses Byte-Array erstellen, können Sie eine beliebige Codierung auswählen, die alle Zeichen in Ihrer Zeichenfolge behandelt. UTF-8 wäre beispielsweise effizienter, wenn der Text in einer lateinischen Sprache verfasst ist, kann aber trotzdem jedes bekannte Zeichen verarbeiten.

Das wichtigste Problem ist, dass jede Software, die die Base64-Zeichenkette decodiert, wissen muss, welche Codierung auf das Byte-Array anzuwenden ist, um die ursprüngliche Zeichenkette neu zu erstellen.

4

Hier ist die Lösung, ich habe eine Random-String-Konvertierung konvertiert, wie Sie jede Größe bis zu 10 geben können, die Base64 ausgeben wird.

//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 
Verwandte Themen