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
また、実行するすべての追加マッピングを含めるには、 を拡張する必要があります。