Soru Bir kodlamayı manuel olarak belirtmeden C # 'de dizelerin tutarlı bir bayt temsilini nasıl edinebilirim?


Nasıl dönüştürebilirim string bir byte[] Belirli bir kodlamayı manuel olarak belirtmeden .NET'te (C #)?

Dizeyi şifreleyeceğim. Dönüştürmeden şifreleyebilirim, ama hala kodlamanın neden burada geldiğini bilmek isterim.

Ayrıca, kodlama neden dikkate alınmalıdır? Dizenin saklandığı byte'ları alabilir miyim? Karakter kodlamalarına neden bağımlılık var?


1912
2018-01-23 13:39


Menşei


Her dize bir bayt dizisi olarak saklanır mı? Neden sadece baytları alamıyorum? - Agnel Kurian
Kodlama olduğu karakterleri baytlarla eşler. Örneğin, ASCII'de, 'A' harfi 65 numaraya eşleşir. Farklı bir kodlamada, aynı olmayabilir. .NET çerçevesinde alınan dizelere yüksek düzeyli yaklaşım, bunu büyük ölçüde gereksiz kılar (bu durum hariç). - Lucas Jones
Şeytanın avukatını oynamak için: Bir bellek içi dizginin baytlarını (.NET'in kullandığı gibi) almak ve bunları bir şekilde (örneğin CRC32) değiştirmek istediğinizde ve ASLA ASLA bunu orijinal dizeye geri çözmek istedi ... Doğru kodlamalarla veya neden hangisini kullanacağınızı niçin önemsediğinize dair doğru değildir. - Greg
Şimdiye kadar hiç kimse bu bağlantıyı vermedi: joelonsoftware.com/articles/Unicode.html - Bevan
Bir char bir bayt değildir ve bir bayt char değildir. Bir char, yazı tipi tablosuna ve sözcüksel bir geleneğe bir anahtardır. Bir dize, karakter dizisidir. (Bir kelime, paragraf, cümle ve başlıkların kendi tür tanımlarını haklı çıkaracak kendi sözel gelenekleri de vardır - ama ben digress). Tamsayılar, kayan nokta sayıları ve diğer her şey gibi, karakterler de bayt olarak kodlanır. Kodlamanın birebir olduğu bir zaman vardı: ASCII. Bununla birlikte, tüm insan sembolojisini barındırmak için, bir baytın 256 permütasyonu yetersizdi ve daha fazla bayt seçici olarak kullanmak için kodlamalar tasarlandı. - George


Cevaplar:


Buradaki cevapların tersine, kodlama konusunda endişelenmenize gerek yok. Eğer baytların yorumlanması gerekmez!

Bahsettiğin gibi, senin amacın "stringin hangi dizede saklandığını al".
(Ve tabii ki, dizeyi bayttan yeniden yapılandırabilmek için.)

Bu hedefler için dürüstüm değil insanların neden kodlamaya ihtiyacınız olduğunu söylemelerini neden anlayın. Bunun için kodlamalar konusunda endişelenmenize kesinlikle gerek yok.

Sadece bunun yerine şunu yapın:

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

static string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}

Programınız (veya diğer programlarınız) denemediği sürece yorumlamak Her nasılsa, bir şekilde yapmak niyetinde olmadığınızdan bahsetmediğiniz baytlar, o zaman hiçbir şey değil Bu yaklaşımda yanlış! Kodlamalar hakkında endişelenmek, gerçek bir sebep olmaksızın hayatınızı daha karmaşık hale getirir.

Bu yaklaşıma ek avantaj:

Dizenin geçersiz karakterler içerip içermediği önemli değil, çünkü yine de verileri alıp orijinal dizeyi yeniden oluşturabilirsiniz.

Sadece aynı şekilde kodlanıp çözülür, çünkü siz sadece baytlara bakıyor.

Yine de belirli bir kodlama kullandıysanız, geçersiz karakterleri kodlama / kod çözme konusunda size sorun yaşardı.


1719
2018-04-30 07:44



Bunun hakkında ne çirkin, bu GetString ve GetBytes Çalışmak için aynı endeniteye sahip bir sistem üzerinde yürütülmesi gerekir. Yani bunu başka bir dizeye dönüştürmek istediğiniz baytları almak için kullanamazsınız. Bu yüzden kullanmak istediğim bir durum bulmak için zor bir zamanım var. - CodesInChaos
@CodeInChaos: Söylediğim gibi, bunun bütün noktası aynı sistemde, aynı işlevler kümesinde kullanmaktır. Eğer değilse, o zaman kullanmamalısınız. - Mehrdad
-1 Birisinin (bytes'i karakterleri anlamayan) dizgisini bir bayt dizisine dönüştürmek istediğini garanti ediyorum, onlar google'a girecek ve bu cevabı okuyacaklar, ve yanlış şeyi yapacaklar, çünkü hemen hemen hepsinde vakalar, kodlama IS İlgili. - artbristol
@artbristol: Eğer cevabı okumaktan rahatsız olmazlarsa (ya da diğer cevaplar ...), özür dilerim, onlarla iletişim kurmak için daha iyi bir yol yoktur. Genelde cevabımla başkalarının neler yapabileceğini tahmin etmeye çalışmak yerine OP'ye cevap vermeyi tercih ederim - OP'nin bilme hakkı vardır ve birisinin bir bıçağı kötüye kullanabilmesi nedeniyle dünyadaki bütün bıçakları saklamamız gerektiği anlamına gelmez. kendimiz için. Yine de aynı fikirde olmamanız da sorun değil. - Mehrdad
Bu cevap, pek çok düzeyde yanlıştır, ancak en önemlisi "kodlama hakkında endişelenmenize gerek yok!" GetBytes ve GetString 2 yöntemi, sadece Encoding.Unicode.GetBytes () ve Encoding.Unicode.GetString () zaten ne yaptığını yeniden uyguladıkları kadar gereksizdir. "Programınız (veya diğer programların) byte'ları yorumlamaya çalışmadığı sürece" ifadesi de "kusurlu" olduğu için temel olarak kusurludur çünkü baytlar Unicode olarak yorumlanmalıdır. - David


Bu dizginizin kodlamasına bağlıdır (ASCII, UTF-8...).

Örneğin:

byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);

Kodlamanın neden önemli olduğu küçük bir örnek:

string pi = "\u03a0";
byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi);

Console.WriteLine (ascii.Length); //Will print 1
Console.WriteLine (utf8.Length); //Will print 2
Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?'

ASCII özel karakterlerle uğraşmak için uygun değildir.

İçinde, .NET framework kullanır UTF-16 dizeleri göstermek için, yalnızca .NET'in kullandığı tam baytları almak istiyorsanız System.Text.Encoding.Unicode.GetBytes (...).

Görmek .NET Framework'de Karakter Kodlaması Daha fazla bilgi için (MSDN).


1052
2018-01-23 13:43



Ancak, kodlama neden dikkate alınmalıdır? Neden kodlamanın kullanıldığını görmeden sadece baytları alamıyorum? Gerekli olsa bile, String nesnesinin hangi kodlamanın kullanıldığını bilmemesi ve hafızada ne olduğunu dökmemesi gerekir mi? - Agnel Kurian
Bir .NET dizeleri her zaman Unicode olarak kodlanır. Yani System.Text.Encoding.Unicode.GetBytes () kullanın; .NET'in karakterleri temsil etmek için kullanacağı bayt kümesini elde etmek için. Ancak neden bunu istiyorsun? Özellikle çoğu karakter batı latin setindeyken UTF-8'i öneririm. - AnthonyWJones
Ayrıca: dizede dahili olarak kullanılan tam baytlar önemli değil bunları alan sistem, kodlamayı yanlış kodlama olarak işliyorsa veya işlemezse. Hepsi .Net ise, neden bir bayt dizisine dönüştürülsün. Aksi takdirde, kodlamanızın açık olması daha iyidir - Joel Coehoorn
@Joel, çalıştırıldığı her makinede farklı olabileceğinden System.Text.Encoding.Default ile dikkatli olun. Bu yüzden her zaman UTF-8 gibi bir kodlamayı belirtmeniz önerilir. - Ash
Siz (veya bir başkasının) gerçekten niyetinde olmadığı sürece kodlamaya ihtiyacınız yoktur. yorumlamak verileri, genel bir "bayt bloğu" olarak ele almak yerine. Sıkıştırma, şifreleme vb. Gibi şeyler için, kodlamanın endişesi anlamsızdır. Görmek cevabım kodlama hakkında endişelenmeden bunu yapmak için bir yol. (Kodlama konusunda endişelenmenize gerek yok diyen bir -1 vermiş olabilirim, ama bugün gerçekten de demek istemiyorum.) P) - Mehrdad


Kabul edilen cevap çok, çok karmaşık. Bunun için dahil edilen .NET sınıflarını kullanın:

const string data = "A string with international characters: Norwegian: ÆØÅæøå, Chinese: 喂 谢谢";
var bytes = System.Text.Encoding.UTF8.GetBytes(data);
var decoded = System.Text.Encoding.UTF8.GetString(bytes);

Gerekmiyorsa tekerleği yeniden icat etmeyin ...


245
2018-04-30 07:26



Kabul edilen cevap sadece çok karmaşık değil, aynı zamanda felaket için bir reçete. - Konamiman
Kabul edilen cevabın değişmesi durumunda, kayıt için geçerli tarih ve zamanda Mehrdad'ın cevabı budur. Umarım, OP bunu tekrar gözden geçirecek ve daha iyi bir çözümü kabul edecektir. - Thomas Eding
prensipte iyi ama kodlama olmalı System.Text.Encoding.Unicode Mehrdad'ın cevabına eşdeğer olmak. - Jodrell
Soru, orijinal cevaptan bu yana bir umutlu kez düzenlenmiştir, bu yüzden belki de cevabım biraz farklıdır. Mehrdad'ın cevabına eşdeğer bir hız vermeyi asla amaçlamadım, ama bunu yapmanın mantıklı bir yolunu verdim. Ama haklı olabilirsin. Ancak, asıl soruda "dizenin hangi baytta saklandığını al" ifadesi çok belirsizdir. Nerede saklandın? Bellekte? Diskte mi? Eğer hafızadaysa System.Text.Encoding.Unicode.GetBytesMuhtemelen daha kesin olacaktır. - Erik A. Brandstadmoen
@AMissico, dizininizin sistem varsayılan kodlamanızla uyumlu olduğundan (sistem varsayılan eski karakter dizinizdeki ASCII karakterlerini içeren dizgeden) emin olmadan öneriniz buggy'dir. Ama hiçbir yerde OP bunu belirtmez. - Frédéric


BinaryFormatter bf = new BinaryFormatter();
byte[] bytes;
MemoryStream ms = new MemoryStream();

string orig = "喂 Hello 谢谢 Thank You";
bf.Serialize(ms, orig);
ms.Seek(0, 0);
bytes = ms.ToArray();

MessageBox.Show("Original bytes Length: " + bytes.Length.ToString());

MessageBox.Show("Original string Length: " + orig.Length.ToString());

for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo encrypt
for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo decrypt

BinaryFormatter bfx = new BinaryFormatter();
MemoryStream msx = new MemoryStream();            
msx.Write(bytes, 0, bytes.Length);
msx.Seek(0, 0);
string sx = (string)bfx.Deserialize(msx);

MessageBox.Show("Still intact :" + sx);

MessageBox.Show("Deserialize string Length(still intact): " 
    + sx.Length.ToString());

BinaryFormatter bfy = new BinaryFormatter();
MemoryStream msy = new MemoryStream();
bfy.Serialize(msy, sx);
msy.Seek(0, 0);
byte[] bytesy = msy.ToArray();

MessageBox.Show("Deserialize bytes Length(still intact): " 
   + bytesy.Length.ToString());

105
2018-01-23 16:36



Tüm bu işlemler için aynı BinaryFormatter örneğini kullanabilirsiniz. - Joel Coehoorn
Çok ilginç. Anlaşılan herhangi bir yüksek vekil Unicode karakterini düşürecektir. İle ilgili belgelere bakın [BinaryFormatter] - John Robertson
@ ErikA.Brandstadmoen Testlerime buradan bakın: stackoverflow.com/a/10384024 - Michael Buen


Kodlamayı hesaba katmanız gerekir, çünkü 1 karakter 1 ile temsil edilebilir yada daha fazla baytlar (yaklaşık 6'ya kadar) ve farklı kodlamalar bu baytları farklı şekilde ele alacaktır.

Joel'in bu konuda bir yazısı var:

Mutlak Minimum Her Yazılım Geliştirici Kesinlikle, Unicode ve Karakter Setleri Hakkında Olmalı Olmalı Olmalıdır (Mazeret Yok!)


79
2018-01-23 14:03



"1 karakter 1 veya daha fazla baytla temsil edilebilir" Katılıyorum. Sadece dizgileri kodlayan şeyden bağımsız olarak bu baytları istiyorum. Bir dizenin bellekte depolanmasının tek yolu bayttır. Hatta karakterler 1 veya daha fazla bayt olarak saklanır. Sadece ellerimi onlara bayt olarak almak istiyorum. - Agnel Kurian
Siz (veya bir başkasının) gerçekten niyetinde olmadığı sürece kodlamaya ihtiyacınız yoktur. yorumlamak verileri, genel bir "bayt bloğu" olarak ele almak yerine. Sıkıştırma, şifreleme vb. Gibi şeyler için, kodlamanın endişesi anlamsızdır. Görmek cevabım kodlama hakkında endişelenmeden bunu yapmak için bir yol. - Mehrdad
@Mehrdad - Tamamen, ama ilk soruya cevap verdiğim gibi, asıl soru, OP'lerin bu baytlarla dönüştürüldükten sonra ne olacağını, ve gelecekteki araştırmacılar için bu konuyla ilgili bilgileri ilgilendirdi. tarafından kapsanan Joel'in cevabı oldukça güzel - ve cevabınızın içinde belirttiğiniz gibi: .NET dünyasına girdiğinizde ve / veya dönüştürmek için yöntemlerinizi kullandığınızda mutlu olursunuz. Bunun dışına çıktığınız anda kodlama önemli olacaktır. - Zhaph - Ben Duguid


Bu popüler bir sorudur. Yazarın sorduğu sorunun ne olduğunu anlamak önemlidir ve bunun en yaygın ihtiyaç olandan farklı olması önemlidir. Gereksiz yere kodun kötüye kullanılmasını engellemek için önce ben cevap verdim.

Ortak ihtiyaç

Her dizenin bir karakter kümesi ve kodlaması vardır. Bir dönüştürdüğünüzde System.String bir dizi nesneye System.Byte hala bir karakter seti ve kodlama var. Çoğu kullanım için, hangi karakterin ayarlandığını ve kodladığınızı bilirsiniz ve .NET, "dönüştürmeyle kopyala" işlemini basitleştirir. Sadece uygun olanı seç Encoding sınıf.

// using System.Text;
Encoding.UTF8.GetBytes(".NET String to byte array")

Dönüştürme, hedef karakter kümesi veya kodlamanın kaynakta bulunan bir karakteri desteklemediği durumlarda ele alınabilir. Bazı seçimleriniz var: istisna, ikame veya atlama. Varsayılan politika bir '?' Yerine geçmektir.

// using System.Text;
var text = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes("You win €100")); 
                                                      // -> "You win ?100"

Açıkçası, dönüşümler mutlaka kayıpsız değildir!

Not: için System.String Kaynak karakter kümesi Unicode'dir.

Sadece kafa karıştırıcı olan şey, .NET'in bu karakter kümesinin belirli bir kodlaması için bir karakter kümesinin adını kullanmasıdır. Encoding.Unicode çağrılmalı Encoding.UTF16.

Çoğu kullanım için bu kadar. Eğer ihtiyacın olan buysa, burada okumayı bırak. Eğlenceye bakın Joel Spolsky makalesi Bir kodlamanın ne olduğunu anlamıyorsanız.

Özel ihtiyaç

Şimdi, soru yazarı sorar, "Her dize bir bayt dizisi olarak saklanır, değil mi? Neden sadece bu baytları alamıyorum?"

Herhangi bir dönüşüm istemiyor.

İtibaren C # spec:

C # karakter ve string işleme Unicode kodlamasını kullanır. Char   tür bir UTF-16 kod birimini temsil eder ve dize türü bir   UTF-16 kod birimleri dizisi.

Yani, null dönüşümünü (yani, UTF-16'dan UTF-16'ya) sorarsak, istenen sonucu alacağımızı biliyoruz:

Encoding.Unicode.GetBytes(".NET String to byte array")

Ama kodlamalardan bahsetmekten kaçınmak için başka bir şekilde yapmalıyız. Bir ara veri türü kabul edilebilirse, bunun için kavramsal bir kısayol vardır:

".NET String to byte array".ToCharArray()

Bu bize istenen veri türünü almaz ama Mehrdad'ın cevabı bu Char dizisini kullanarak bir Byte dizisine nasıl dönüştürüleceğini gösterir. BlockCopy. Ancak, bu dize iki kez kopyalar! Ayrıca, kodlamaya özel kod da açıkça kullanılır: veri türü System.Char.

String'in saklandığı gerçek baytlara ulaşmanın tek yolu bir işaretçiyi kullanmaktır. fixed deyim, değerlerin adresini almayı sağlar. C # spec'ten:

Tür dizgisinin bir ifadesi için ... başlatıcıyı hesaplar.   dizedeki ilk karakterin adresi.

Bunu yapmak için, derleyici, kodun, string nesnesinin diğer bölümleri üzerinden atlanacağını yazar. RuntimeHelpers.OffsetToStringData. Bu nedenle, ham baytları almak için dizeye bir işaretçi oluşturun ve gereken bayt sayısını kopyalayın.

// using System.Runtime.InteropServices
unsafe byte[] GetRawBytes(String s)
{
    if (s == null) return null;
    var codeunitCount = s.Length;
    /* We know that String is a sequence of UTF-16 codeunits 
       and such codeunits are 2 bytes */
    var byteCount = codeunitCount * 2; 
    var bytes = new byte[byteCount];
    fixed(void* pRaw = s)
    {
        Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount);
    }
    return bytes;
}

@CodesInChaos'un belirttiği gibi, sonuç makinenin endianitesine bağlıdır. Ancak soru yazarı bununla ilgilenmez.


76
2017-12-02 04:43



Genel olarak ayarlamak doğru değil byteCount dize uzunluğunun iki katı kadar. Temel Çok Dilli Düzlem'in dışındaki Unicode kod noktaları için, her karakter için iki adet 16 bit kod birimi olacaktır. - Jan Hettich
@Jan Bu doğru ama dize uzunluğu zaten kod birimleri (kod noktaları değil) sayısını verir. - Tom Blodget
Bunu işaret ettiğin için teşekkürler! MSDN'den: " Length mülkiyet String] sayısını döndürür Char Bu örnekte nesneler, Unicode karakterlerinin sayısı değil. "Örnek kodunuz bu nedenle yazılmıştır. - Jan Hettich
@TomBlodget: İlginçtir, eğer örnekleri alırsa Globalization.SortKey, ayıklar KeyDatave sonuçtaki her bayttan bir tanesini paketler. String [karakter başına iki bayt, MSB önce] String.CompareOrdinal Sonuçta elde edilen dizgiler, aramadan önemli ölçüde daha hızlı olacaktır. SortKey.Compare örneklerinde SortKeyhatta arama memcmp bu örneklerde. Bunu anladım, nedenini merak ediyorum KeyData bir döndürür Byte[] yerine bir String? - supercat
@TomBlodget: İhtiyacınız yok fixed veya unsafe kod, ayrıca yapabilirsin var gch = GCHandle.Alloc("foo", GCHandleType.Pinned); var arr = new byte[sizeof(char) * ((string)gch.Target).Length]; Marshal.Copy(gch.AddrOfPinnedObject(), arr, 0, arr.Length); gch.Free(); - Mehrdad


Sadece Mehrdrad'ın sesini göstermek için Cevap Çalışır, onun yaklaşımı bile ısrar edebilir eşleştirilmemiş vekil karakterler(ki bunların çoğu benim cevabımla dengelenmişti, ama bu herkesin eşit derecede suçlu olduğu, örneğin. System.Text.Encoding.UTF8.GetBytes, System.Text.Encoding.Unicode.GetBytes; Bu kodlama yöntemleri yüksek vekil karakterler devam edemez d800örneğin, ve sadece yüksek vekil karakterleri sadece değerle değiştirirler fffd ):

using System;

class Program
{     
    static void Main(string[] args)
    {
        string t = "爱虫";            
        string s = "Test\ud800Test"; 

        byte[] dumpToBytes = GetBytes(s);
        string getItBack = GetString(dumpToBytes);

        foreach (char item in getItBack)
        {
            Console.WriteLine("{0} {1}", item, ((ushort)item).ToString("x"));
        }    
    }

    static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }        
}

Çıktı:

T 54
e 65
s 73
t 74
? d800
T 54
e 65
s 73
t 74

Bunu dene System.Text.Encoding.UTF8.GetBytes veya System.Text.Encoding.Unicode.GetBytesonlar sadece yüksek vekil karakterleri değerle değiştirecekler FFFD

Her ne zaman bu soruda bir hareket varsa, hala dizeleri kaldırabilen bir serileştiriciyi (Microsoft'tan veya 3. parti bileşenlerinden olabilir) düşünmüyorum; Ben her zaman şimdi google ve sonra: serileştirme eşleştirilmemiş vekil sunucu.. Bu benim herhangi bir uykuyu kaybetmemi sağlamaz, ama şimdi her seferinde sinir bozucu ve sonra cevabımın kusurlu olduğuna dair yorum yapan biri var, ama eşleştirilmemiş vekil karakterler söz konusu olduğunda cevapları eşit derecede hatalı.

Darn, Microsoft yeni kullanmış olmalı System.Buffer.BlockCopy onun içinde BinaryFormatter ツ

谢谢!


35
2017-07-25 22:52



Geçerli kod noktaları oluşturmak için vekillerin çift olarak görünmesi gerekmez mi? Eğer durum buysa, verilerin neden karıştırılacağını anlayabiliyorum. - dtanders
@duders Evet, bu benim de düşüncelerim, çiftler halinde görünmek zorundadırlar, eşleştirilmemiş vekil karakterler sadece kasten bunları diziye koyup bunları eşleştirmezseniz gerçekleşir. Bilmediğim şey, diğer devlerin, serileştirme yaklaşımını düşündükleri için kodlama duyarlı yaklaşımını kullanmamız gerektiğine dikkat etmeleridir (cevabım3 yıldan uzun süredir kabul edilen bir cevap olan), eşleştirilmemiş vekil karakterini sağlam tutmuyor. Ancak kodlama duyarlı çözümlerinin eşleştirilmemiş vekil karakterini de saklamadığını kontrol etmeyi unutmuşlardı, ironi ツ - Michael Buen
Kullanan bir serileştirme kitaplığı varsa System.Buffer.BlockCopy dahili olarak, tüm kodlama-savunuculuk üyeleri argümanları tartışılacaktır - Michael Buen
Testinizdeki sorun, geçersiz bir dize yaptığınızdır. "UTF-16'da, her zaman çiftler halinde görünürler, yüksek bir vekil ve ardından düşük bir vekil, böylece bir kod noktasını göstermek için 32 bit kullanırlar.". / UDC00 ile / uD800'ü izlerseniz, tüm unicode biçimlerinde iyi çalışır. Bunun bir dizi değil, bir dizi olduğu unutulmamalıdır, bu nedenle belirli kısıtlamalar mantıklıdır. Ayrıca, UTF7'de / uDC00 olmadan bile iyi çalışıyor. - Trisped
@ dtanders: A System.String değişmez bir dizisidir Char; .NET her zaman izin verdi String herhangi birinden inşa edilecek nesne Char[] ve içeriğini bir Char[] Orijinali olsa bile aynı değerleri içeren Char[] eşlenmemiş vekiller içerir. - supercat