我在这里问了一个问题,得到了答案,但在另一个方向改变了主题。这就是为什么我新提出这个问题的原因。我的老问题:File encoding doesn't work
我的新问题:如果字符串中的字符可以使用特定编码进行编码,我该如何检查? 我想知道哪个字符在我的原始代码中创建了问题。我尝试了一个回答我的问题,但我刚刚创建了一条错误消息,但这似乎没有用。
消息是,索引262处有一个"错误"在一行约10个字符。
代码:
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);
}
答案 0 :(得分:1)
您可以使用EncoderFallback.ExceptionFallback
而不是使用EncoderFallback.ReplacementFallback
,并指定在不可映射字符的情况下使用的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;
}
}
将encoding
替换为以下内容。
Encoding encoding = Encoding.GetEncoding(28605, new MyEncoderFallback(), DecoderFallback.ExceptionFallback);
在我的测试中,&#34; abcdおはようefgh&#34;被编码为&#34; abcd#0004:304a ## 0005:306f ## 0006:3088 ## 0007:3046#efgh&#34;