.Net提供了在编码转换失败时抛出异常的选项。您需要使用EncoderExceptionFallback类(如果输入字符无法转换为编码输出字节序列),则创建编码时会抛出EncoderFallbackException异常。下面的代码是从那个类的文档:
Encoding ae = Encoding.GetEncoding(
"us-ascii",
new EncoderExceptionFallback(),
new DecoderExceptionFallback());
然后使用该编码来执行转换:
// The input string consists of the Unicode characters LEFT POINTING
// DOUBLE ANGLE QUOTATION MARK (U+00AB), 'X' (U+0058), and RIGHT POINTING
// DOUBLE ANGLE QUOTATION MARK (U+00BB).
// The encoding can only encode characters in the US-ASCII range of U+0000
// through U+007F. Consequently, the characters bracketing the 'X' character
// cause an exception.
string inputString = "\u00abX\u00bb";
byte[] encodedBytes = new byte[ae.GetMaxByteCount(inputString.Length)];
int numberOfEncodedBytes = 0;
try
{
numberOfEncodedBytes = ae.GetBytes(inputString, 0, inputString.Length,
encodedBytes, 0);
}
catch (EncoderFallbackException e)
{
Console.WriteLine("bad conversion");
}
这MSDN page, "Character Encoding in the .NET Framework"讨论,在一定程度上,后面的默认转换行为的理由。总之,他们不想干扰依赖于此行为的传统应用程序。不过,他们建议覆盖默认值。
很好的解释。我曾看到过这样一句话:“您可能想考虑让应用程序将EncoderFallback或DecoderFallback设置为EncoderExceptionFallback或DecoderExceptionFallback,以防止设置了第8位的序列。”在文档中,但对我来说这并不明显,它可以用于严格的转换。 – AndiDog 2010-10-04 22:12:09