.NET:如何判断编码是否支持字符串中的所有字符?

我有很多需要输出的文本,其中包括来自多种语言的各种字符。 有时我需要输出除Unicode之外的字符编码(例如,Shift-JIS或ISO-8859-2)的文本,以匹配它将要访问的页面。

如果文本具有编码无法处理的字符(例如,ISO-8859-2编码输出中的日文字符),则输出结果中出现奇数字符。 我可以逃避他们,但我宁愿这样做只有在真的有必要的时候。

所以,我的问题是:如果编码可以处理我的字符串中的所有字符,是否有一种方法可以提前告诉我?

编辑:我认为EncoderFallback可能是我问的问题的正确答案。 不幸的是,它似乎并不适合我的特殊情况。 我的想法是将字符转换为它们的HTML实体等价物(例如,モ而不是モ)。 但是,编码器只转换它找到的第一个这样的字符,如果我设置了Response.ContentEncoding,它根本就不会调用我的EncoderFallback。

您可以编写自己的EncoderFallback类,在编码之前将其分配给编码器。

使用这种方法,您无需在高级中执行任何操作(可能只是处理输出字符串以查找问题)。

相反,您的Fallback类只需要处理编码没有字符值的替换。

尝试使用EncoderFallback设置为EncoderExceptionFallback的Encoding对字符串进行编码。 例如。:

Encoding e= Encoding.GetEncoding(932, new EncoderExceptionFallback(), new DecoderExceptionFallback()); 

然后在GetBytes()时捕获EncoderFallbackException 。

将其转换为目标编码,将其转换回来并与原始编码进行比较?

尝试使用Encoding.GetBytes()和Encoding.GetStrings()来进行转换。

作为优化,您可以从原始字符串中搜索所有使用过的unicode字符,然后使用它来尝试编码。

我认为这些方法已经有效了。 (EncoderFallback解决方案似乎相当不错。)但是,如果您愿意,可以选择以下方法。

通过调用encoding.GetEncoder()为要测试的编码创建编码器。 然后,您可以调用Encoder对象的Convert方法,传入文本,并查看已完成的 out参数的值以确定它是否成功。

如果速度是一个问题,你可能想要对各种方法进行基准测试,但我怀疑他们都会有非常相似的性能配置文件。