2011-01-14 4 views
3

私はC#にネイティブC++からいくつかのコードを移植していると私は、次の操作を行う必要があります。C#ASCII GetBytes認識できない変換に使用する文字を設定する方法は?

ASCII.GetBytesはそれはそれはそれは私に進数63(クエスチョンマーク)の文字を返し認識しないUnicode文字に遭遇したときには中私のC++コードWideCharToMultiByte(CP_ACP, ...を使用して、それが小数点37(%記号)の文字を使用していることを知らない文字に遭遇したとき。

私の質問は、未知の文字の#63ではなく#37に戻ってASCII.GetBytesを返すことができますか?

答えて

6

C#では、どのように動作するかを決定するために、エンコードのDecoderFallback/EncoderFallbackを使用することができます。 自体のフォールバックは変更できませんが、クローンしてフォールバックを設定できます。ここに例があります:

using System; 
using System.Text; 

class Test 
{  
    static void Main() 
    { 
     Encoding asciiClone = (Encoding) Encoding.ASCII.Clone(); 
     asciiClone.DecoderFallback = new DecoderReplacementFallback("%"); 
     asciiClone.EncoderFallback = new EncoderReplacementFallback("%"); 

     byte[] bytes = { 65, 200, 66 }; 
     string text = asciiClone.GetString(bytes); 
     Console.WriteLine(text); // Prints A%B 
     bytes = asciiClone.GetBytes("A\u00ffB"); 
     Console.WriteLine(bytes[1]); // Prints 37 
    } 
} 
+0

EncoderFallbackのご協力ありがとうございます! asciiClone.GetBytes( "☃")。これが#1 Jonです。 – Brian

+0

@Brian:なぜEncoderFallbackではなくDecoderFallbackを使用したのか分かりません。コードを編集します:) –

0

おそらくC++コードはWideCharToMultiBytelpDefaultChar = "%"を呼び出します。

これをEncoding.GetBytesコールに渡す方法はありませんが、P/Invokeを使用してWideCharToMultiByteに電話することができます。

+0

残念ながら、C++文字列はデータベースにあり、既に変換されています。だから私はC++からすでに変換された何百万もの文字列を持っており、同じことをC#で進めていく必要があります。 – Brian

+0

さらに悪いことに、これはSQLインジェクションC#dllではなく、通常のC#dllであるため、WideCharToMultiByteを呼び出すことはできません。 – Brian

関連する問題