2009-05-19 6 views
1

Ich habe ein kleines Problem beim Ändern der Ecoding einer Zeichenfolge. Tatsächlich lese ich aus einer DB Zeichenfolgen, die mit der Codepage 850 codiert sind, und ich muss sie vorbereiten, um für einen interoperablen WCF-Dienst geeignet zu sein.Codierung Konvertierungsproblem

Von der DB I Zeichen \ x10 und \ x11 (Dreiecksformen), und ich will wandeln sie in das Unicode-Format lesen, um die Serialisierung/Deserialisierung Problem während der WCF Aufrufs zu verhindern. (Zeichen und sind nicht gemäß den XML-Spezifikationen gültig, selbst wenn WCF sie serialisiert).

Jetzt verwende ich folgenden Code, um String-Codierung zu verdecken, aber nichts passiert. Die Ergebniszeichenfolge ist identisch mit der ursprünglichen Zeichenfolge.

ich wahrscheinlich bin etwas fehlt ...

Bitte helfen Sie mir !!!

Emanuele

static class UnicodeEncodingExtension 
    { 
     public static string Convert(this Encoding sourceEncoding, Encoding targetEncoding, string value) 
     { 
      string reEncodedString = null; 

      byte[] sourceBytes = sourceEncoding.GetBytes(value); 
      byte[] targetBytes = Encoding.Convert(sourceEncoding, targetEncoding, sourceBytes); 
      reEncodedString = sourceEncoding.GetString(targetBytes); 

      return reEncodedString; 
     } 

    } 

    class Program 
    { 
     private static Encoding Cp850Encoding = Encoding.GetEncoding(850); 
     private static Encoding UnicodeEncoding = Encoding.UTF8; 

     static void Main(string[] args) 
     { 
      string value; 
      string resultValue; 
      value = "\x10"; 
      resultValue = Cp850Encoding.Convert(UnicodeEncoding, value); 

      value = "\x11"; 
      resultValue = Cp850Encoding.Convert(UnicodeEncoding, value); 

      value = "\u25b6"; 
      resultValue = UnicodeEncoding.Convert(Cp850Encoding, value); 

      value = "\u25c0"; 
      resultValue = UnicodeEncoding.Convert(Cp850Encoding, value); 

     } 

    } 

Antwort

0

die in String gespeichert Alle Strings sind in der Tat Unicode.Unicode. Lesen Sie: Strings in .Net and C# und The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Edit: Ich nehme an, dass Sie die Funktion Convert möchten automatisch \ x11 ändern u25c0 auf \, aber das Problem hier ist, dass \ x11 in fast jede Codierung gültig ist, beginnen die Unterschiede in der Regel in Zeichen \ x80, so dass die Funktion Convert es beibehalten wird, selbst wenn Sie das tun:

string reEncodedString = null; 
byte[] unicodeBytes = UnicodeEncoding.Unicode.GetBytes(value); 
byte[] sourceBytes = Encoding.Convert(Encoding.Unicode, 
           sourceEncoding, unicodeBytes); 

Sie in unicode.org die Zuordnungen von CP850 zu Unicode sehen können. Damit diese Konvertierung stattfindet, müssen Sie diese Zeichen manuell ändern.

0

Es scheint, Sie denken, dass ein Problem auf einem falschen Verständnis beruht. Aber jmservera ist korrekt - alle Strings in .NET sind intern als Unicode codiert.

Sie haben nicht genau gesagt, was Sie erreichen möchten. Haben Sie ein Problem am anderen Ende der Leitung?

Nur FYI, können Sie die Textcodierung auf eine WCF-Bindung mit der textMessageEncoding element in der Konfigurationsdatei festlegen.

+0

Das Problem ist während der Java-Client-seitigen Decodierung.Wenn eine Zeichenfolge \ x10 oder \ x11 WCF enthält, können sie fälschlicherweise in und codiert werden, die keine gültigen XML-Zeichen gemäß XML-Spezifikation sind. Ich habe hier [http://en.wikipedia.org/wiki/Code_page_850] gesehen, dass char \ x10 in codePage 850 mit char \ u25ba korrespondiert und ich dachte, dass die Konvertierung der Kodierung mein Problem lösen sollte. –

+0

Gemäß der XML-Spezifikation müssen Prozessoren UTF-8 und UTF-16 verarbeiten. Können Sie also nicht als UTF-8 codieren und Ihre Zeichen über die Leitung an die Client-Seite versenden? – Cheeso

+0

Nein. Wenn ich \ x10 serialisiere, ist das Ergebnis , das ist ein gültiges Unicode-Zeichen, aber kein gültiges XML-Zeichen. In anderen Welten behandeln XML-Spezifikationen UTF-* - Zeichen mit Ausnahme bestimmter Zeichenbereiche. Siehe hier [http://www.w3.org/TR/2008/REC-xml-20081126/#charsets] –

0

Ich vermute, dass diese Linie Ihre Ursache sein kann

reEncodedString = sourceEncoding.GetString(targetBytes); 

, die Ihre Ziel codierte Zeichenfolge von Bytes zu nehmen scheint und fragt Ihr sourceEncoding einen String aus ihnen zu machen. Ich habe keine Chance zu überprüfen, es habe, aber ich vermute, dass die folgenden vielleicht besser

reEncodedString = targetEncoding.GetString(targetBytes); 
0
  1. byte[] sourceBytes =Encoding.Default.GetBytes(value)
  2. Encoding.UTF8.GetString(sourceBytes)

diese Sequenz nützlich zum Download Unicode-Datei aus dem Dienst (zum Beispiel XML-Datei, die persisches Zeichen enthält)

0

Sie sollten dies versuchen:

byte[] sourceBytes = sourceEncoding.GetBytes(value); 
var convertedString = Encoding.UTF8.GetString(sourceBytes);