2009-05-19 22 views
1

文字列のエコーを変更するのに少し問題があります。実際には、コードページ850を使用してエンコードされたDB文字列を読み込み、相互運用可能なWCFサービスに適しているように準備する必要があります。エンコーディング変換の問題

DBからは、\ x10と\ x11(三角形)の文字を読み込み、WCF呼び出し中のシリアル化/デシリアライゼーションの問題を防ぐために、それらをUnicode形式に変換します。 (Chars であり、WCFがそれらを直列化してもXML仕様に従って有効ではありません)。

ここでは、文字列エンコードを隠すために次のコードを使用しますが、何も起こりません。結果の文字列は実際には元の文字列と同じです。

私はおそらく何かが不足しています...

私を助けてください!

エマヌエーレ

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); 

     } 

    } 

答えて

0

文字列に格納されているすべての文字列は、実際Unicode.Unicodeです。 Read:Strings in .Net and C#The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

編集:変換機能で\ x11を\ u25c0に自動的に変更したいと思っていますが、\ x11はほぼすべてのエンコードで有効ですが、違いは通常文字\

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

あなたがUnicodeにCP850からunicode.orgマッピングで見ることができます:X80、変換機能は、あなたがそれを行う場合でも、それを維持しますので。したがって、この変換が発生するには、これらの文字を手動で変更する必要があります。

0

誤った理解に基づいて問題があると思われます。しかし、jmserveraは正しいです - .NETのすべての文字列は、Unicodeとして内部的にコード化されています。

あなたは達成したいことを正確には言いませんでした。あなたは電線の反対側の問題を経験していますか?

ちょうどFYIでは、設定ファイルのtextMessageEncoding elementでWCFバインディングのテキストエンコードを設定できます。

+0

問題は、Javaクライアント側のデコード中に発生します。文字列に\ x10または\ x11が含まれている場合、WCFはXML仕様では有効でないXML文字である および で誤ってエンコードを許可します。私はここでコードページ850のchar \ x10がchar \ u25baに対応していることを知っていたので、変換のエンコーディングは私の問題を解決するはずだと思った[http://en.wikipedia.org/wiki/Code_page_850] –

+0

XML仕様に従って、プロセッサはUTF-8とUTF-16を処理する必要があります。ですから、UTF-8としてエンコードすることはできませんし、文字をクライアント側に送ることができますか? – Cheeso

+0

いいえ。シリアル番号を\ x10にすると、結果は有効なUnicode文字であるが有効なXML文字ではない になります。他の世界では、XML仕様は、特定のchar範囲を除いてUTF- * charを処理します。ここをクリックしてください[http://www.w3.org/TR/2008/REC-xml-20081126/#charsets] –

0

私は、この行はバイトのターゲットエンコードされた文字列を取るように見えるし、それらの外に列を作るためにあなたのsourceEncodingを尋ねるあなたの犯人

reEncodedString = sourceEncoding.GetString(targetBytes); 

かもしれ疑います。私はそれを検証する機会があっていませんでしたが、私は次は、たとえばサービスからのダウンロードUnicodeのファイルについては、このシーケンス便利(

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

良いかもしれない疑いペルシア文字を含むxmlファイル)

0

これを試してください:

byte[] sourceBytes = sourceEncoding.GetBytes(value); 
var convertedString = Encoding.UTF8.GetString(sourceBytes); 
関連する問題