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

时间:2009-03-10 17:26:01

标签: c# .net text encoding character-encoding

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

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

然后在GetBytes()时抓住EncoderFallbackException

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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