Laden...

UTF-7-Encoding und das böse '+'

Letzter Beitrag vor 12 Jahren 6 Posts 2.248 Views
UTF-7-Encoding und das böse '+'

Hallo,

ich habe hier ein sehr merkwürdiges Verhalten beim Encoding/Decoding von UTF-7-Strings. Ich bekomme einen UTF-7 String per Netzwerkstream und gebe diesen in C# aus. Das funktioniert auch wunderbar, bis auf das '+'.

Laut Tabelle hat das + die Ordnungszahl 43.
(bei 42 hätte ich Verschwörung! gerufen und wär' unter den Tisch gehoppst)

In einer kleinen Testanwendungen kann ich das Verhalten reproduzieren. Die 43 wird einfach als nicht darstellbares Zeichen umgesetzt. Wenn ich das (darstellbare) + umwandle bekomme ich 43.
?(


        private void button1_Click(object sender, EventArgs e)
        {
            List<byte> digits = new List<byte>();

            // In der Tabelle ist die 43 Blank
            for (int i = 33; i <= 255; i++)
            {
                if (i % 10 == 0) digits.AddRange(Encoding.UTF7.GetBytes("\r\n"));
                digits.AddRange(Encoding.UTF7.GetBytes(i.ToString() + ":"));
                digits.Add((byte)i);
                digits.AddRange(Encoding.UTF7.GetBytes("\t"));
            }

            MessageBox.Show(Encoding.UTF7.GetString(digits.ToArray()));
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // Gibt mir 43 aus!
            MessageBox.Show((Encoding.UTF7.GetBytes("+")[0]).ToString());
        }

Hi,
bist Du Dir denn sicher, dass die Bytes, die Du bekommst, wirklich UTF-7 sind, und diese auch richtig kodiert wurden?


//das ergibt die Bytes 43 und 45 (also + und -)
byte[] plusBytes = Encoding.UTF7.GetBytes("+");
//das ergibt dann wieder "+"
string plusString = Encoding.UTF7.GetString(plusBytes);

Siehe als Erklärung auch diese Seite:http://www.sttmedia.de/unicode-utf7
LG, Marko

Hallo Levion,

wenn es wirklich UTF-7 ist, dann steht '+' nicht für das Pluszeichen, sondern leitetet eine Codeseqenz ein. Siehe UTF-7.

herbivore

Danke trashkid, danke herbivore,

ich bekomme natürlich auch 43 und 45 nur sehe ich das nicht, wenn ich nur den Index 0 ausgebe m(


// Gibt mir 43 aus!
MessageBox.Show((Encoding.UTF7.GetBytes("+")[0]).ToString());

// ... und 45 :)
MessageBox.Show((Encoding.UTF7.GetBytes("+")[1]).ToString());

In der freien Wildbahn ist es so, dass ich den UTF-7 String über eine API bekomme. Dabei scheint die Kodierung an der Stelle buggy zu sein. Alle anderen Zeichen werden einfwandfrei kodiert.

Gruß

Hallo Levion,

Dabei scheint die Kodierung an der Stelle buggy zu sein.

oder es ist eben doch nicht UTF-7, sondern z.B. UTF-8 oder Encoding.Default.

herbivore

Der String, der da behandelt wird, ist eine SMS (Blackberry) und die sollen grundsätzlich in UTF-7 kodiert sein. Wenn ich UTF-8 oder Default benutze, bekomme ich nur einen Leerstring.

Alles außer '+' wird ja auch sauber dekodiert. Ich habe jetzt als Workaround eingebaut, dass ein alleinstehendes '+' im String durch '+-' ersetzt wird. Damit scheint das Problem behoben.

Gruß