System.String is UTF16
והפעם, טיפה Encoding
תדע כל מתכנתת עבריה: כל string בדוט נט הוא ב encoding של UTF16.
ואגב, זו הסיבה שסיריאליזציה ל XML היא כברירת מחדל UTF16.
"ואם אני רוצה string עם encoding אחר?"
-אין.
אין כזה דבר בדוט נט.
רוצה string? -יש רק ב encoding של UTF16.
רוצה משהו אחר (נניח, UTF32)? יש בייצוגים אחרים של הטקסט: byte array למשל.
הנה קצת קוד:
using System.Text;
namespace Playing.With.Strings
{
class Program
{
static void Main(string[] args)
{
string myText = "hello";
byte[] asciiBytes = Encoding.ASCII.GetBytes(myText);
Console.WriteLine("ASCII bytes:");
Console.WriteLine(ByteArrayToString(asciiBytes));
Console.WriteLine(Encoding.ASCII.GetString(asciiBytes));
byte[] unicodeBytes = Encoding.Unicode.GetBytes(myText);
Console.WriteLine("Unicode bytes:");
Console.WriteLine(ByteArrayToString(unicodeBytes));
Console.WriteLine(Encoding.Unicode.GetString(unicodeBytes));
byte[] utf32Bytes = Encoding.UTF32.GetBytes(myText);
Console.WriteLine("UTF32 bytes:");
Console.WriteLine(ByteArrayToString(utf32Bytes));
Console.WriteLine(Encoding.UTF32.GetString(utf32Bytes));
Console.WriteLine("done, press *enter* to quit…");
Console.ReadLine();
}
public static string ByteArrayToString(byte[] source)
{
StringBuilder sb = new StringBuilder();
sb.Append("[");
int sourceLength = source.Length;
for (int k = 0; k < sourceLength; k++)
{
sb.Append(source[k]);
if (k != sourceLength - 1)
sb.Append(", ");
}
sb.Append("]");
string result = sb.ToString();
return result;
}
}
}
והתוצאה היא:
ASCII bytes: [104, 101, 108, 108, 111] hello Unicode bytes: [104, 0, 101, 0, 108, 0, 108, 0, 111, 0] hello UTF32 bytes: [104, 0, 0, 0, 101, 0, 0, 0, 108, 0, 0, 0, 108, 0, 0, 0, 111, 0, 0, 0] hello done, press *enter* to quit...
בשורה התחתונה, כדי לייצג טקסט עם encoding אחר, אני בד"כ משתמש ב byte array.
