1

署名付き XML を WebClient 経由でゲートウェイに送信しています。ここで、ノードの値にドイツ語の文字のみが含まれていることを確認する必要があります。私は2つのテストワードを持っています。最初のものは、次を使用して非常にうまく変換されます。

string foreignString = "Łůj꣥ü";
Encoding utf8 = Encoding.UTF8;
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
byte[] utfBytes = Encoding.Convert(iso, utf8, iso.GetBytes(foreignString));
string result = utf8.GetString(utfBytes);

しかし、2 番目の文字列には、UTF-8 エンコーディングにも含まれる文字があります。その

ç (Latin small letter c with cedilla)

他のエンコーディングで少しテストした後、常に同じ結果が得られました。文字は常にそこにありました。それはUTF-8テーブルの一部であるため、何が理にかなっています:)

私の質問は、ドイツ語のウムラウトを削除せずに、フランス語、ポルトガル語、スペイン語のすべての文字をマスクする方法はありますか?

前もって感謝します!

4

1 に答える 1

2

Encoding特別なルールを追加して、ISO-8859-1 エンコーディングに基づいて独自のクラスを作成できます。

class GermanEncoding : Encoding {

  static readonly Encoding iso88791Encoding = Encoding.GetEncoding("ISO-8859-1");

  static readonly Dictionary<Char, Char> charMappingTable = new Dictionary<Char, Char> {
    { 'À', 'A' },
    { 'Á', 'A' },
    { 'Â', 'A' },
    { 'ç', 'c' },
    // Add more mappings
  };

  static readonly Dictionary<Byte, Byte> byteMappingTable = charMappingTable
    .ToDictionary(kvp => MapCharToByte(kvp.Key), kvp => MapCharToByte(kvp.Value));

  public override Int32 GetByteCount(Char[] chars, Int32 index, Int32 count) {
    return iso88791Encoding.GetByteCount(chars, index, count);
  }

  public override Int32 GetBytes(Char[] chars, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex) {
    var count = iso88791Encoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex);
    for (var i = byteIndex; i < byteIndex + count; ++i)
      if (byteMappingTable.ContainsKey(bytes[i]))
        bytes[i] = byteMappingTable[bytes[i]];
    return count;
  }

  public override Int32 GetCharCount(Byte[] bytes, Int32 index, Int32 count) {
    return iso88791Encoding.GetCharCount(bytes, index, count);
  }

  public override Int32 GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteCount, Char[] chars, Int32 charIndex) {
    return iso88791Encoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex);
  }

  public override Int32 GetMaxByteCount(Int32 charCount) {
    return iso88791Encoding.GetMaxByteCount(charCount);
  }

  public override Int32 GetMaxCharCount(Int32 byteCount) {
    return iso88791Encoding.GetMaxCharCount(byteCount);
  }

  static Byte MapCharToByte(Char c) {
    // NOTE: Assumes that each character encodes as a single byte.
    return iso88791Encoding.GetBytes(new[] { c })[0];
  }

}

このエンコーディングは、ISO-8859-1 エンコーディングを使用したいという事実に基づいており、「ドイツ語以外の」文字を対応する ASCII にマップする場合にいくつかの追加の制限があります。組み込みの ISO-8859-1 エンコーディングはマッピング方法を認識しŁLおり、ISO-8859-1 はシングルバイト文字セットであるため、各バイトが文字に対応するため、バイトに対して追加のマッピングを行うことができます。これはGetBytesメソッドで行われます。

次のコードを使用して、文字列を「きれいにする」ことができます。

var encoding = new GermanEncoding();
string foreignString = "Łůj꣥üç";
var bytes = encoding.GetBytes(foreignString);
var result = encoding.GetString(bytes);

結果の文字列はLujeLAüc.

実装は非常に単純化されており、辞書を使用してバイトの追加のマッピング手順を実行することに注意してください。これは効率的ではないかもしれませんが、その場合は、256 バイトのマッピング配列を使用するなどの代替手段を検討できます。charMappingTableまた、実行するすべての追加マッピングを含めるには、 を拡張する必要があります。

于 2012-10-26T07:36:05.540 に答える