C# 检查字符是否可使用特定编码进行编码

C# 检查字符是否可使用特定编码进行编码,c#,debugging,encoding,C#,Debugging,Encoding,我在这里问了一个问题,得到了答案,但话题换了个方向。这就是为什么我新提出这个问题。我的老问题是: 我的新问题:如何检查字符串中的字符是否可以使用特定编码进行编码? 我想知道是哪个角色在我的原始代码中制造了问题。我试着用我以前的问题得到的答案来回答,但这只是产生了一条错误信息,似乎没有什么意义 消息是,在大约10个字符的行上有一个“索引262处出错” 这就是代码: string[] Lines = reactor.GetMergedLines(); string fileName = "foo.b

我在这里问了一个问题,得到了答案,但话题换了个方向。这就是为什么我新提出这个问题。我的老问题是:

我的新问题:如何检查字符串中的字符是否可以使用特定编码进行编码? 我想知道是哪个角色在我的原始代码中制造了问题。我试着用我以前的问题得到的答案来回答,但这只是产生了一条错误信息,似乎没有什么意义

消息是,在大约10个字符的行上有一个“索引262处出错”

这就是代码:

string[] Lines = reactor.GetMergedLines();
string fileName = "foo.bar";
try 
{           
    Encoding encoding = Encoding.GetEncoding(28605, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
    for (int i = 0; i < Lines.Length; i++)
    {
        File.WriteAllLines(fileName, Lines, encoding);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
string[]line=reactor.GetMergedLines();
字符串fileName=“foo.bar”;
尝试
{           
Encoding Encoding=Encoding.GetEncoding(28605,encoderCallback.ExceptionFallback,decoderCallback.ExceptionFallback);
对于(int i=0;i
而不是使用
EncoderFallback.exception fallback
您可以使用
EncoderFallback.replacement fallback
并指定在不可映射字符的情况下使用的
DefaultString

要获得问题的答案,可以滚动您自己的
EncoderFallback
子类,该子类提供您自己的
EncoderFallbackBuffer
。在处理字符编码时,将为该缓冲区指定字符和位置

下面是一个快速而肮脏的实现

class MyEncoderFallback: EncoderFallback
{
    public override int MaxCharCount { get { return 11; } }
    public override EncoderFallbackBuffer CreateFallbackBuffer()
    {
        return new MyEncoderFallbackBuffer();
    }
}

class MyEncoderFallbackBuffer: EncoderFallbackBuffer
{
    private List<char> _encoded = new List<char>();
    private int _nextIndex = 0;

    public override int Remaining { get { return _encoded.Count - _nextIndex; } }

    public override bool Fallback(char unknownChar, int index)
    {
        var encoded = String.Format("#{0:d4}:{1:x4}#", index, (int)unknownChar);

        _encoded.Clear();
        _encoded.AddRange(encoded.AsEnumerable());

        _nextIndex = 0;

        return true;
    }

    public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
    {
        return false;
    }

    public override char GetNextChar()
    {
        char next;
        if(_nextIndex < _encoded.Count)
        {
            next = _encoded[_nextIndex];
            _nextIndex += 1;
        }
        else 
        {
            next = default(char);
        }

        return next;
    }

    public override bool MovePrevious()
    {
        bool result;

        if(_nextIndex > 0)
        {
            _nextIndex -= 1;
            result = true;
        }
        else
        {
            result = false;
        }

        return result;
    }

    public override void Reset()
    {
        _encoded.Clear();
        _nextIndex = 0;     
    }
}

在我的测试中,“abcdおはよう“efgh”被编码为“abcd#0004:304a#0005:306f#0006:3088#0007:3046#efgh”

您能从一开始就尝试计算所有行(包括新行)中写入的字符数,看看262是什么字符吗?如果您不喜欢异常,请不要使用EncoderFallback.ExceptionFallback。改用EncoderReplacementFallback。“选择替换由您决定,当然没有什么是理想的。@HansPassant我决定使用ExceptionFallback来消除编码错误替换。这就是我老问题中的问题:)就像我在老问题中指出的那样:理论上,源文件中的所有字符都应该可以编码为目标编码,而不会出现任何问题。我想知道,是哪些角色造成了这些问题。我不知道如何用另一种方式解决这个问题。。。总体问题是,目标文件中的某些字符没有正确编码。例如,它们被问号所取代。我如何创建这样的子类?添加了编码示例。非常感谢。这很有帮助。:)
Encoding encoding = Encoding.GetEncoding(28605, new MyEncoderFallback(), DecoderFallback.ExceptionFallback);