我通过WebClient将签名的XML发送到网关。现在我必须确保节点值只包含德语字母。我有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);
但是在第二个字符串中是一个也包含在UTF-8编码中的字符。它的
ç (Latin small letter c with cedilla)
在用其他编码测试一下后,我总是得到相同的结果:角色总是在那里。有意义的是,因为它是UTF-8表的一部分:)
所以我的问题是:有没有办法掩盖所有法国,葡萄牙和西班牙的角色,而不会丢掉德国的变音符号?
提前致谢!
答案 0 :(得分:2)
您可以根据ISO-8859-1编码创建自己的Encoding
课程,并附加其他特殊规则:
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字节映射数组等替代方案。此外,您需要展开{{1}}以包含您要执行的所有其他映射。