Вероятно, было бы проще просто жестко закодировать преобразование самостоятельно - создать char[]
из 256 значений, заполнить первые 128 позиций только эквивалентными числами, а затем заполнить остальные вручную. «Соотношение» между ними - это не то, что вы можете получить математически, это просто произвольное присвоение значений
Например:
private static readonly char[] CodePage1256 = GenerateCodePage1256();
private static readonly char[] GenerateCodePage1256()
{
char[] ret = new char[256];
for (int i = 0; i < 128; i++)
{
ret[i] = (char) i;
}
string upperCharacters =
"\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021" +
"\u02c6\u2030"; // etc - from the Wikipedia page
for (int i = 0; i < 128; i++)
{
ret[i + 128] = upperCharacters[i];
}
}
Тогда у вас есть прямое отображение byte
на char
. Конечно, это потенциально подверженный ошибкам процесс - другой возможностью было бы создание файла с отображением в системе, в которой имеет эту кодовую страницу.
В любом случае, получив отображение, вы можете легко преобразовать любой массив байтов в массив строк или символов, после чего вы можете использовать обычные классы .NET, чтобы снова записать файл как UTF-8. Например:
using (Stream input = File.Open("input.txt"))
{
using (StreamWriter output = File.CreateText("output.txt"))
{
byte[] byteBuffer = new byte[8 * 1024];
char[] charBuffer = new char[byteBuffer.Length];
int bytesRead;
while ((bytesRead = input.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
for (int i = 0; i < bytesRead; i++)
{
charBuffer[i] = CodePage1256[byteBuffer[i]];
}
output.Write(charBuffer, 0, bytesRead);
}
}
}