我有一个通过编码1256保存的文本文件
至于我的设备上的Windows CE 5.0不支持该代码页,我无法通过.NET CF中的编码打开文件,但操作系统支持Unicode。 (我在表单中显示了一些硬代码字符串)
我怎样才能读取该文件并将其数据转换为Unicode?
如何将单个字符转换为其UTF8等效字节?
THIS LINK表示在1256代码页表中,字符编号200 / C8为0x0628。那么它们之间的关系是什么?如果我有200 / C8,我怎么能得到0x0628?
答案 0 :(得分:3)
最简单的方法就是自己对转换进行硬编码 - 创建256个值的char[]
,用相同的数字填充前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
映射。当然,这是一个可能容易出错的过程 - 另一种可能性是在 拥有该代码页的系统上创建带有映射的文件。
无论如何,一旦你有了映射,就可以轻松地将任何字节数组转换为字符串或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);
}
}
}